Оператор слияния в одной таблице записей - PullRequest
1 голос
/ 14 декабря 2010

Мне нужно написать один оператор, чтобы вставить или обновить запись в одной таблице записей.

оператор слияния позволяет мне написать это:

create table t1 (n int)

-- insert into t1 (n) Values (1);  -- uncomment to test the matched branch

MERGE t1 AS P
USING (SELECT 3 AS n) AS S
ON 1 = 1
WHEN MATCHED THEN
    UPDATE SET n = S.n
WHEN NOT MATCHED THEN
    INSERT (n) 
    VALUES (S.n);

select * from t1    

эта работа, но ядумаю, что цель условия 1 = 1 не очень легко понять.Существует ли другой синтаксис для вставки записи, когда таблица пуста, или для обновления записи, когда она уже существует?

Ответы [ 3 ]

2 голосов
/ 14 декабря 2010

Другой вариант - сделать это по старинке.

if exists (select null from t1)
    update t1 set n = 3
else
    insert into t1 (n) values (3)
0 голосов
/ 19 апреля 2012

Пример недавней процедуры, которую я написал для обновления существующей строки или вставки новой строки.Таблица имеет ту же структуру, что и MembershipEmailFormat табличной переменной.

Обнаружено, что проще всего создать переменную таблицы, которая будет источником в предложении Using.Я понимаю, что главная цель операторов Merge - объединение нескольких строк между двумя таблицами.Мой вариант использования заключается в том, что мне нужно вставить новый адрес электронной почты для пользователя или изменить существующий адрес электронной почты.

CREATE PROCEDURE [dbo].[usp_user_merge_emailformat]
        @UserID UNIQUEIDENTIFIER,
        @Email varchar(256),
        @UseHTML bit
AS
BEGIN
    --SELECT @UserID='04EFF187-AEAC-408E-9FA8-284B31890FBD',
    --       @Email='person@xxxx.com',
    --       @UseHTML=0

    DECLARE @temp TABLE
    (
            UserID UNIQUEIDENTIFIER,
            Email varchar(256),
            HtmlFormat bit
    )       

    INSERT INTO @temp(UserID,Email, HtmlFormat)
    Values(@UserID,@Email,@UseHTML)

    SELECT * FROM @temp    

    MERGE dbo.MembershipEmailFormat as t
    USING @temp AS s
    ON (t.UserID = s.UserID and t.Email = s.Email)
    WHEN MATCHED THEN UPDATE SET t.HtmlFormat = s.HtmlFormat
    WHEN NOT MATCHED THEN INSERT VALUES(s.UserID,s.Email,s.HtmlFormat);
END
0 голосов
/ 14 декабря 2010

Заменить

ON 1 = 1

на

ON S.n = P.n
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...