Sql server 如果记录不存在,则要检查和插入的SQL Server 2008合并语句

Sql server 如果记录不存在,则要检查和插入的SQL Server 2008合并语句,sql-server,merge,Sql Server,Merge,我试图通过sql脚本检查记录是否存在的特定条件,将记录添加到表中。我正在尝试使用Merge语句。它不起作用,我不知道我哪里出了问题。有人能帮我吗?。谢谢 MERGE Categories As target USING ( SELECT CategoryKey From Categories where CategoryName = 'TestName' ) AS source on (source.CategoryKey = target.CategoryKe

我试图通过sql脚本检查记录是否存在的特定条件,将记录添加到表中。我正在尝试使用Merge语句。它不起作用,我不知道我哪里出了问题。有人能帮我吗?。谢谢

MERGE Categories As target
    USING (
    SELECT CategoryKey 
    From Categories where CategoryName = 'TestName'
    ) AS source on (source.CategoryKey = target.CategoryKey)
WHEN Not Matched THEN
    INSERT VALUES ('TestName');
这将完成工作:

MERGE Categories As target
USING (SELECT 'TestName' AS CategoryName) AS source 
    ON (source.CategoryName = target.CategoryName)
WHEN NOT MATCHED THEN
    INSERT (CategoryName) VALUES ('TestName');
这将完成工作:

MERGE Categories As target
USING (SELECT 'TestName' AS CategoryName) AS source 
    ON (source.CategoryName = target.CategoryName)
WHEN NOT MATCHED THEN
    INSERT (CategoryName) VALUES ('TestName');

你到底想完成什么

我之所以这样问,是因为您使用的是作为目标和源的同一个表,并且因为您正在比较CategoryKey(我假设它是主键),所以当不匹配时,
条件将永远不会被计算,因为如果您有一个ID为1、2和3的表,并且在ID=ID的情况下与自身进行比较,则所有行都将计算为true

尝试将不匹配时的
更改为匹配时的
,然后更新
,并编写一个简单的测试更新sop,您可以看到我所说的行为

编辑 试试这个(假设您的ID是自动递增的)


你到底想完成什么

我之所以这样问,是因为您使用的是作为目标和源的同一个表,并且因为您正在比较CategoryKey(我假设它是主键),所以当不匹配时,
条件将永远不会被计算,因为如果您有一个ID为1、2和3的表,并且在ID=ID的情况下与自身进行比较,则所有行都将计算为true

尝试将不匹配时的
更改为匹配时的
,然后更新
,并编写一个简单的测试更新sop,您可以看到我所说的行为

编辑 试试这个(假设您的ID是自动递增的)


谢谢你的回复,迭戈。但是我不想更新记录,我需要做的只是检查CategoryName为'TestName'的记录是否存在。如果存在,则不执行任何操作,否则我要添加记录。请再次阅读我的答案。我说运行更新只是为了让你了解发生了什么。以您编写查询的方式,您永远不会得到“不匹配时”的答复,谢谢迭戈。但是我不想更新记录,我需要做的只是检查CategoryName为'TestName'的记录是否存在。如果存在,则不执行任何操作,否则我要添加记录。请再次阅读我的答案。我说运行更新只是为了让你了解发生了什么。以您编写查询的方式,您永远不会得到“不匹配时”的答案,非常感谢AdaTheDev!!这真的帮了汉克斯很大的忙!!这真的很有帮助