Можно ли использовать синтаксис Sql MERGE для ОБНОВЛЕНИЯ / ВСТАВКИ данных из другой переменной TABLE? - PullRequest
0 голосов
/ 25 июня 2010

Я хочу Insert или Update строки в таблице - поэтому я хочу попробовать и использовать синтаксис MERGE . Моя проблема в том, что мои данные (для вставки / обновления) существуют в variable table. Я не уверен, как написать правильный синтаксис для вставки / обновления части.

Вот мой псевдо-код: -

-- Here's the Variable Table ... and not it has not PK.
DECLARE @PersonId INTEGER

DECLARE @variableTable TABLE (
    @SomeScore DECIMAL(10,7),
    @SomeAverage DECIMAL(10,7),
    @SomeCount INTEGER)

-- Insert or Update
MERGE INTO SomeTable
WHERE PersonId = @PersonId
WHEN MATCHED THEN
    UPDATE
    SET PersonScore = ??????????
        PersonAverage = ???????
        PersonCount = ????????
WHEN NOT MATCHED THEN
    INSERT(PersonId, PersonScore, PersonAverage, PersonCount)
    VALUES(@PersonId, ????, ?????, ????)

.. и я не уверен, как убедиться, что UPDATE корректно обновляет только 1 строку (т. Е. ... для этого нужно условие WHERE?)

Наконец, я основал этот пост на этом ТАКОМ вопросе .

1 Ответ

1 голос
/ 25 июня 2010

Да, это возможно. Ваш синтаксис был выключен, хотя. Ниже, кажется, работает. Я сохранил @PersonId как отдельную скалярную переменную вне табличной переменной, так как она у вас есть в вашем вопросе. И я предположил, что первичный ключ SomeTable - PersonId

DECLARE @PersonId INT

DECLARE @variableTable TABLE (
    SomeScore DECIMAL(10,7),
    SomeAverage DECIMAL(10,7),
    SomeCount INTEGER
    )

-- Insert or Update
MERGE SomeTable AS T
USING @variableTable AS S
ON (T.PersonId = @PersonId) 

WHEN MATCHED THEN
    UPDATE
    SET T.PersonScore = SomeScore,
        T.PersonAverage = SomeAverage,
        T.PersonCount = SomeCount
WHEN NOT MATCHED  BY TARGET THEN
    INSERT(PersonId, PersonScore, PersonAverage, PersonCount)
    VALUES(@PersonId, SomeScore, SomeAverage, SomeCount);
...