我需要从this之类的select中执行upsert,但是在SQL Server中。我发现有人在SQL Server here中进行了upsert,但这并非来自选择。
我的查询现在基本上看起来像这样:
INSERT INTO (table1) (...)
SELECT (...)
FROM (table 2)
WHERE X NOT IN (SELECT Y from (table1) WHERE Y IS NOT NULL)
但是我不知道如何添加更新部分。我想在99%的时间之后将其作为插入内容来添加更新部分。
编辑:如果我能够通过SELECT
进行操作,此代码将起作用:
BEGIN TRY
INSERT INTO table1 (id, name, itemname, itemcatName, itemQty)
VALUES ('val1', 'val2', 'val3', 'val4', 'val5')
END TRY
BEGIN CATCH
UPDATE table1
SET name = 'val2',
itemname = 'val3',
itemcatName = 'val4',
itemQty = 'val5'
WHERE id = 'val1'
END CATCH
答案 0 :(得分:1)
我想应该保持相同的思路
update t1
set ......
from table1 t1
inner join table2 on t1.Y=table2.X
请注意,已更新表必须使用别名,以便基于联接进行更新。
或者,您可以环顾四周(或等待答案)以获取MERGE。只需声明就可以进行upsert这样的操作,这是非常优雅的,但是我还没有得出结论,可能的不利之处是否值得。
答案 1 :(得分:0)
update table1
set name = 'val2', itemname = 'val3', itemcatName = 'val4', itemQty = 'val5'
where id = 'val1'
IF @@ROWCOUNT = 0
insert into table1(id, name, itemname, itemcatName, itemQty)
values('val1', 'val2', 'val3', 'val4', 'val5')
执行UPSERT: http://en.wikipedia.org/wiki/Upsert
答案 2 :(得分:0)
如果您想INSERT
(如果一条记录不存在)或UPDATE
(如果有),请尝试此操作
IF EXISTS (SELECT 1 FROM table1 WHERE somecol = @someval)
BEGIN
UPDATE T1
SET T1.someCol1 = T2.someCol1
,T1.someCol2 = T2.someCol2
--, etc, etc
FROM table1 T1
INNER JOIN table2 T2 ON T1.Id = T2.T1_FK
END
ELSE
BEGIN
INSERT INTO table1 (someCol, someCol2 --,etcetc)
SELECT T2.someCol1, T2.someCol2 --etc etc
FROM table2 T2
WHERE somecol = @someval
END
答案 3 :(得分:0)
先进行更新
update t1
SET (...)
FROM (table2) t2
JOIN table1 t1 WHERE t1.Y = t2.X
INSERT INTO (table1) (...)
SELECT (...)
FROM (table2) t2
WHERE NOT EXISTS (SELECT 1 from table1 WHERE Y = t2.X)