雅各布问了一个完美的问题:给我MERGE
语法。
那里的每个答案都会立即跳到他们能想到的最复杂的案例;用无关的混淆来掩盖语法。
马克给出了答案:
MERGE
member_topic AS target
USING
someOtherTable AS source
ON
target.mt_member = source.mt_member
AND source.mt_member = 0
AND source.mt_topic = 110
WHEN MATCHED THEN
UPDATE SET mt_notes = 'test'
WHEN NOT MATCHED THEN
INSERT (mt_member, mt_topic, mt_notes) VALUES (0, 110, 'test')
;
看着这个答案,我和雅各布一样困惑:
我没有 someOtherTable
Marc 建议这someOtherTable
是一个虚拟的占位符值 - 你没有那个表并不重要。
我试了一下,SQL Server确实抱怨
无效的对象名称“someOtherTable”。
这让我很难理解如果它不重要(除了实际上重要)USING
是USING foo
什么。
当我使用 SQL Server 2008 MERGE 语法时USING
使用foo时使用的是什么?
奖金问题
使用 MERGE 的 UPSERT 语法是什么:
IF (rowExists)
UPDATE Users SET Firstname='Ian', LastName='Boyd' WHERE Username='iboyd'
ELSE
INSERT INTO Users (UserGUID, Username, FirstName, LastName, AuthenticationMethod)
VALUES ('{77410DC5-7A3E-4F1A-82C6-8EFB3068DE66}', 'iboyd', 'Ian', 'Boyd', 'Windows')
变成(我试过的确切代码):
begin transaction
MERGE
Users
USING
foo
ON
Users.UserName = foo.UserName
WHEN MATCHED THEN
UPDATE SET Firstname = foo.FirstName, Lastname = foo.LastName
WHEN NOT MATCHED THEN
INSERT (UserGUID, Username, FirstName, LastName, AuthenticationMethod)
VALUES ('{77410DC5-7A3E-4F1A-82C6-8EFB3068DE66}', 'iboyd', 'Ian', 'Boyd', 'Windows')
; --A MERGE statement must be terminated by a semi-colon (;).
rollback
Msg 208, Level 16, State 1, Line 3
Invalid object name 'foo'.
?
使用
Users
包含列的表:UserGUID uniqueidentifier Username varchar(50) FirstName varchar(50) LastName varchar(50) AuthenticationMethod varchar(50)
更新:
USING <table_source>
在哪里table_source
:
table_or_view_name [ [ AS ] table_alias ] [ <tablesample_clause> ]
[ WITH ( table_hint [ [ , ]...n ] ) ]
| rowset_function [ [ AS ] table_alias ]
[ ( bulk_column_alias [ ,...n ] ) ]
| user_defined_function [ [ AS ] table_alias ]
| OPENXML <openxml_clause>
| derived_table [ AS ] table_alias [ ( column_alias [ ,...n ] ) ]
| <joined_table>
| <pivoted_table>
| <unpivoted_table>
在哪里joined_table
:
不明确的
在哪里pivoted_table
:
不明确的
在哪里unpivoted_table
:
不明确的