Что ИСПОЛЬЗУЕТСЯ в синтаксисе SQL Server 2008 MERGE?

Джейкоб задал идеальный вопрос:give me the MERGE syntax.

Каждый ответ тут же прыгает в самый сложный случай, о котором они только могут подумать; скрытие синтаксиса с посторонним замешательством.

Марк далответ:

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')
; 

Глядя на этот ответ, я так же растерялся, как и Джейкоб:

I don't have a someOtherTable

Марк предположил, чтоsomeOtherTable является фиктивным значением заполнителя - не имеет значения, что у вас нет этой таблицы.

i try it, and SQL Server does complain

Invalid object name 'someOtherTable'.

Это заставляет меня изо всех сил пытаться понять, чтоUSING вUSING foo являетсяfor если это не важно (кроме действительно важных).

Что такоеUSING используя, когда он используетfoo когда я использую SQL Server 2008 MERGE синтаксис?

Bonus Question

Что такое синтаксис UPSERT с использованием MERGE:

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'.

?

With a Users table that contains the columns:

UserGUID uniqueidentifier
Username varchar(50)
FirstName varchar(50)
LastName varchar(50)
AuthenticationMethod varchar(50)

Update:

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 является:

undefined

кудаpivoted_table является:

undefined

кудаunpivoted_table является:

undefined

Ответы на вопрос(3)

Ваш ответ на вопрос