在单个记录表上合并语句

时间:2010-12-14 16:56:32

标签: sql-server tsql

我需要编写一个语句来插入或更新单个记录表中的记录

merge语句允许我写这个:

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 个答案:

答案 0 :(得分:2)

另一种选择是以老式的方式来做。

if exists (select null from t1)
    update t1 set n = 3
else
    insert into t1 (n) values (3)

答案 1 :(得分:0)

替换

ON 1 = 1

ON S.n = P.n

答案 2 :(得分:0)

我写的更新现有行或插入新行的最近程序示例。 Table具有与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