Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 单记录表上的Merge语句_Sql Server_Tsql - Fatal编程技术网

Sql server 单记录表上的Merge语句

Sql server 单记录表上的Merge语句,sql-server,tsql,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 MATCHE

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

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条件的目的不是很容易理解。
在表为空时插入记录或在记录已存在时更新记录,是否有不同的语法?

另一种选择是采用老式的方法

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

ON 1 = 1


我最近编写的更新现有行或插入新行的过程示例。 表的结构与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

我认为这将导致在S.n P.n时插入一个新记录,因此表将增长到多个记录
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