使用SQL Server 2016,我在循环中有一个非常简单的IF NOT Exists ..... INSERT statement
。如预期的那样,此方法效果很好。是否有一种方法可以识别没有插入的现有记录,因此没有插入第二条查询而插入的不存在记录?
我可以通过执行SELECT轻松实现这一点,然后如果找不到,则插入,但是这是我循环中的两个查询。我想尝试通过一个查询来实现这一目标?
这样做的目的是向用户显示:
因此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
答案 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)