Ответ 1
Или используя новый синтаксис MERGE:
merge into users u
using (
select 'username' as uname
) t on t.uname = u.username
when not matched then
insert (username) values (t.uname);
У меня есть база данных, структурированная следующим образом:
пользователей
userid (Primary Key)
username
группа
groupid (PK)
groupName
user_groups
userid (Foreign Key)
groupid (Foreign Key)
При первом входе пользователя в систему я хотел бы, чтобы их информация была добавлена в таблицу пользователей. По существу логика, которую я хотел бы иметь, если
if (//users table does not contain username)
{
INSERT INTO users VALUES (username);
}
Как я могу сделать это с помощью SQL Server/С#?
Или используя новый синтаксис MERGE:
merge into users u
using (
select 'username' as uname
) t on t.uname = u.username
when not matched then
insert (username) values (t.uname);
В основном вы можете сделать это так:
IF NOT EXISTS (SELECT * FROM USER WHERE username = @username)
INSERT INTO users (username) VALUES (@username)
А если серьезно, как вы узнаете, посетил ли пользователь ваш сайт впервые? Вы должны вставить записи в таблицу user, когда кто-то регистрируется на вашем сайте, а не логинится.
IF NOT EXISTS (select * from users where username = 'username')
BEGIN
INSERT INTO ...
END
Сначала я создал бы сохраненный процесс на БД, чтобы выполнить проверку, и вставил, если необходимо:
CREATE PROCEDURE AddNewUserProc
(
@username VarChar(50) -- replace with your datatype/size
)
AS
IF NOT EXISTS (SELECT * FROM users WHERE username = @username)
BEGIN
INSERT INTO users
VALUES (@username)
END
Затем метод в приложении, который будет вызывать эту процедуру
public void AddNewUserMethod(string userName)
{
SqlConnection connection = new SqlConnection("connection string");
SqlCommand command = new SqlCommand("AddNewUserProc", connection);
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add("username", SqlDbType.VarChar, 50).Value = userName;
try
{
connection.Open();
command.ExecuteNonQuery();
}
finally
{
if (connection.State == ConnectionState.Open) { connection.Close(); }
}
}
Обратите внимание, оставив это как альтернативный/исторический, но с целью правильности верный способ - использовать оператор Merge, см. ответ fooobar.com/questions/48692/... или проверить MS Doc. https://docs.microsoft.com/en-us/sql/t-sql/statements/merge-transact-sql?view=sql-server-ver15
Следующий код - это метод, который возвращает 0, если пользователь уже существует и возвращает новый пользовательский ID, который только что добавил:
private int TryToAddUser(string UserName)
{
int res = 0;
try
{
string sQuery = " IF NOT EXISTS (select * from users where username = @username) \n\r" +
" BEGIN \n\r" +
" INSERT INTO users values (@username) \n\r" +
" SELECT SCOPE_IDENTITY() \n\r " +
" END \n\r " +
" ELSE SELECT 0";
using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand())
{
cmd.CommandText = sQuery;
cmd.Parameters.AddWithValue("@username",UserName);
cmd.Connection = new System.Data.SqlClient.SqlConnection("SomeSqlConnString");
cmd.Connection.Open();
res = (int)cmd.ExecuteScalar();
cmd.Connection.Close();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
return res;
}
@gbn отвечает SQL Server 2008 или выше. Я пробовал использовать метод слияния. Уродливо, возможно, но это работает.
declare @user varchar(50)
set @user = 'username'
insert into users (username)
select @user
where not exists (
select username
from users
where username = @user
);
Если вы хотите протестировать любой из ответов, вот SQL для таблицы -
CREATE TABLE [dbo].[users](
[userid] [int] NULL,
[username] [varchar](50) NULL
)
INSERT [dbo].[users] ([userid], [username]) VALUES (1, N'John')
INSERT [dbo].[users] ([userid], [username]) VALUES (2, N'David')
INSERT [dbo].[users] ([userid], [username]) VALUES (3, N'Stacy')
INSERT [dbo].[users] ([userid], [username]) VALUES (4, N'Arnold')
INSERT [dbo].[users] ([userid], [username]) VALUES (5, N'Karen')
Вот пример (возможно, упрощенного), который касается вашей проблемы. Обратите внимание, что всегда лучше использовать параметры для предотвращения инъекционных атак, особенно при проверке пользователей.
CREATE PROCEDURE AddUser
@username varchar(20)
AS
IF NOT EXISTS(SELECT username FROM users WHERE [email protected])
INSERT INTO users(username) VALUES (@username)
Есть простое решение! Я нашел это в этом посте!
INSERT INTO users (Username)
SELECT ('username')
WHERE NOT EXISTS(SELECT * FROM users WHERE Username= 'username')
В моем проекте мне нужно было сделать это с двумя значениями. Итак, мой код был:
INSERT INTO MyTable (ColName1, ColName2)
SELECT 'Value1','Value2'
WHERE NOT EXISTS
(SELECT * FROM MyTable WHERE ColName1 = 'Value1' AND ColName2= 'Value2')
Надеюсь, это поможет!