2014-01-28 21 views
2

如何在Microsoft SQL Server Management Studio 2008 r2中將合併函數與@variables結合使用?帶變量的SQL MERGE

我在線搜索的所有示例都使用表格合併到表格中。這是可能的變量?

例如:

CREATE PROCEDURE UpdateOrder 
      @id int, 
      @payment_date smalldatetime, 
      @amount numeric(10,2) 

AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 



    MERGE order AS o 
    USING @id, @payment_date, @amount 
    ON @id = o.id 
    WHEN MATCHED THEN 
        UPDATE SET 
           o.payment_date = @payment_date, 
           o.amount = @amount 
           o.last_updated_on = GETDATE() 
    WHEN NOT MATCHED THEN 
     INSERT(o.id,o.payment_id,o.amount) 
     VALUES(@id,@payment_id,@amount); 

這是行不通的。謝謝!

+0

你有沒有嘗試過類似'使用(選擇@id作爲id,@ payment_date作爲payment_date,@amount作爲金額)myVals'?然後引用myVals.id,ect?我沒有嘗試過,只是扔在那裏。 – Dan

回答

12

可以使用VALUES條款作出單行派生表,然後剩下的就是像往常一樣。

MERGE order AS o 
USING (VALUES (@id, 
       @payment_date, 
       @amount)) AS s(id, payment_date, amount) 
ON s.id = o.id 
WHEN MATCHED THEN 
    UPDATE SET o.payment_date = s.payment_date, 
      o.amount = s.amount, 
      o.last_updated_on = GETDATE() 
WHEN NOT MATCHED THEN 
    INSERT(o.id, 
     o.payment_id, 
     o.amount) 
    VALUES(s.id, 
     s.payment_id, 
     s.amount); 

您可能需要閱讀Use Caution with SQL Server's MERGE Statement以及雖然。

+0

我一直在尋找這篇文章的亞倫來解釋OP爲什麼我不會使用合併聲明:) –

+0

真棒這個作品,但我會採取你的建議,以避免合併。我將使用@ M.Ali的建議。感謝你們倆! –

7

或者你可以簡單地檢查記錄的存在,然後執行更新/插入

IF EXISTS(SELECT * FROM [order] WHERE ID = @id) 
BEGIN 
    UPDATE [order] 
     SET payment_date = @payment_date, 
      amount  = @amount, 
      last_updated_on = GETDATE() 
    WHERE ID = @id 
END 

ELSE 

BEGIN 
    INSERT INTO [order](id,payment_id,amount) 
    VALUES(@id,@payment_id,@amount) 
END