2014-01-28 2 views
2

Как использовать функцию слияния с @variables в Microsoft SQL Server Management Studio 2008 r2?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

Вы пробовали что-то вроде 'using (выберите @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

Я искал эту статью Аарона, чтобы объяснить ОП, почему я бы не использовал заявление о слиянии :) –

+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 
Смежные вопросы