INSERT INTO如果不存在SQL服务器

我有一个数据库结构如下:

用户

userid (Primary Key) username 

 groupid (PK) groupName 

user_groups

 userid (Foreign Key) groupid (Foreign Key) 

用户第一次登录时,我希望将他们的信息添加到users表中。 所以基本上我想要的逻辑是

 if (//users table does not contain username) { INSERT INTO users VALUES (username); } 

如何使用SQL Server / C#智能地执行此操作?

或者使用新的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) 

但严重的是,您是如何知道用户是否第一次访问您的网站? 当有人在您的网站上注册而不是登录时,您必须在表用户中插入记录。

 IF NOT EXISTS (select * from users where username = 'username') BEGIN INSERT INTO ... END 

我首先在db上创建一个存储过程来进行检查并在必要时插入:

 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 

然后在app上调用此过程的方法

 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(); } } } 

以下代码是一个方法,如果用户已经存在则返回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') 

这是一个(可能是过于简化的)示例,可以解决您的问题。 请注意,最好使用参数来防止注入攻击,尤其是在validation用户时。

 CREATE PROCEDURE AddUser @username varchar(20) AS IF NOT EXISTS(SELECT username FROM users WHERE username=@username) INSERT INTO users(username) VALUES (@username)