如果不存在,则插入记录更新的循环中

时间:2018-12-24 01:11:00

标签: sql sql-server tsql sql-server-2016

使用SQL Server 2016,我在循环中有一个非常简单的IF NOT Exists ..... INSERT statement。如预期的那样,此方法效果很好。是否有一种方法可以识别没有插入的现有记录,因此没有插入第二条查询而插入的不存在记录?

我可以通过执行SELECT轻松实现这一点,然后如果找不到,则插入,但是这是我循环中的两个查询。我想尝试通过一个查询来实现这一目标?

这样做的目的是向用户显示:

  1. 克里斯现在已经以英语报名
  2. Chris现在已经注册了数学
  3. 克里斯已经参加了科学

因此1和2不存在,因此被插入。 3存在,因此没有插入

和jon的此循环示例:

    for i = 0 to numOfCourses
        sql = IF NOT EXISTS (SELECT fieldName from tableName 
        WHERE courseID = 1 AND directoryID = 2)
        BEGIN
        INSERT INTO tableName(courseID, directoryID)
        VALUES (1, 2) 
        END 
    next

2 个答案:

答案 0 :(得分:0)

@@ROWCOUNT在这里可能会有用...

INSERT INTO tableName(courseID, directoryID)
SELECT 1 as courseID, 2 as directoryID 
WHERE NOT EXISTS (SELECT 1 FROM tableName WHERE courseID = 1 AND directoryID = 2);

SELECT CASE WHEN @@ROWCOUNT = 1 
            THEN 'Chris is now enrolled in English'
            ELSE 'Chris was already enrolled in English' END as my_result;

使用这种方法,您不需要循环中的IF语句或现有记录的初始检查。

我改编自How to get number of rows inserted by a transaction

希望有帮助。

答案 1 :(得分:0)

您可以结合使用MERGE (Transact-SQL)OUTPUT Clause (Transact-SQL)命令

Merge将执行条件插入,而OUTPUT将返回/保存插入的记录。
然后,您只需要比较已插入的给定记录和表中已存在的插入集合中不存在的记录。

DECLARE @InsertedNames AS TABLE (Name VARCHAR(200))
DECLARE @GivenNames AS TABLE (Name VARCHAR(200))
INSERT INTO @GivenNames VALUES ('One'), ('Two')

MERGE INTO TableName AS t  
USING (SELECT Name FROM @GivenNames) AS given (Name)  
    ON t.Name = given.Name  
WHEN NOT MATCHED THEN  
    INSERT (Name) VALUES (given.Name)  
OUTPUT inserted.Name INTO @InsertedNames;

-- return all names with result.
SELECT 'inserted', Name FROM @InsertedNames  
UNION ALL  
SELECT 'already existed', g.Name 
FROM @GivenNames g 
WHERE g.Name NOT IN (SELECT Name FROM @InsertedNames)