Sql server 单记录表上的Merge语句
我需要编写一条语句来插入或更新单个记录表中的记录 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
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