如何在T-SQL中编写简单的插入或更新?

P.B*_*key 2 sql sql-server-2000 upsert

我有一个流程,我不想跟踪某些内容是创建还是更新.跟踪会很复杂.我想执行创建或更新.架构就像......

col1 varchar() (PK)
col2 varchar() (PK)
col3 varchar() (PK)
col4 varchar()
Run Code Online (Sandbox Code Playgroud)

我正在考虑做

TRY
{
    INSERT ...
}
CATCH(DuplicateKeyException)
{
    UPDATE ...
}
Run Code Online (Sandbox Code Playgroud)

你有什么建议?


我想确保我理解其他最高投票的答案.鉴于我的模式,UPDATE总是会发生(即使使用INSERT),但插入只发生在它不存在的地方?

 //UPSERT
INSERT INTO [table]
SELECT [col1] = @col1, [col2] = @col2, [col3] = @col3, [col4] = @col4
FROM [table]
WHERE NOT EXISTS (
    -- race condition risk here?
    SELECT  1 
    FROM [table] 
    WHERE [col1] = @col1 
        AND [col2] = @col2
        AND [col3] = @col3
)

UPDATE [table]
SET [col4] = @col4
WHERE [col1] = @col1 
    AND [col2] = @col2
    AND [col3] = @col3
Run Code Online (Sandbox Code Playgroud)

Chr*_*ein 6

update table1 set col1=1,col2=2,col3=3 where a=1
if @@ROWCOUNT=0
   insert into table1 (col1,col2,col3) values (1,2,3)
Run Code Online (Sandbox Code Playgroud)

我认为它比先检查存在更快.