Sql server 2008 需要将INSERT\UPDATE转换为MERGE的帮助吗
这是一个很好的合并命令候选者吗 源数据必须也是另一个表,还是可以是传递的变量 如果必须是一个表,那么将传递的变量插入临时表是否正常 你能帮我弄一下语法吗Sql server 2008 需要将INSERT\UPDATE转换为MERGE的帮助吗,sql-server-2008,tsql,Sql Server 2008,Tsql,这是一个很好的合并命令候选者吗 源数据必须也是另一个表,还是可以是传递的变量 如果必须是一个表,那么将传递的变量插入临时表是否正常 你能帮我弄一下语法吗 CREATE PROCEDURE [dbo].[usp_ConvertToMerge] @GL_DT date ,@SRC_SYS_ID varchar(60) ,@MLR_SRC_SYS_CD char(3) ,@TRSRY_FEED_DT date ,@Data
CREATE PROCEDURE [dbo].[usp_ConvertToMerge]
@GL_DT date
,@SRC_SYS_ID varchar(60)
,@MLR_SRC_SYS_CD char(3)
,@TRSRY_FEED_DT date
,@Data varchar(20)
AS
BEGIN
IF NOT EXISTS (SELECT
@GL_DT
FROM
MLR_REBATE_IBOR_INFO_2
WHERE
[GL_DT] = @GL_DT
AND [SRC_SYS_ID] = @SRC_SYS_ID
AND [MLR_SRC_SYS_CD] = @MLR_SRC_SYS_CD
AND [TRSRY_FEED_DT] = @TRSRY_FEED_DT)
BEGIN
INSERT INTO [dbo].[MLR_REBATE_IBOR_INFO_2]
([GL_DT],
[SRC_SYS_ID],
[MLR_SRC_SYS_CD],
[TRSRY_FEED_DT],
[Data])
SELECT
@GL_DT
,@SRC_SYS_ID
,@MLR_SRC_SYS_CD
,@TRSRY_FEED_DT
,@Data
END
ELSE
BEGIN
UPDATE [dbo].[MLR_REBATE_IBOR_INFO_2]
SET [Data] = @Data
WHERE [GL_DT] = @GL_DT
AND [SRC_SYS_ID] = @SRC_SYS_ID
AND [MLR_SRC_SYS_CD] = @MLR_SRC_SYS_CD
AND [TRSRY_FEED_DT] = @TRSRY_FEED_DT
END
END
GO
我想我做到了:
CREATE PROCEDURE MyMergeTest
@GL_DT date
,@SRC_SYS_ID char(20)
,@MLR_SRC_SYS_CD char(3)
,@TRSRY_FEED_DT date
,@Data varchar(20)
AS
BEGIN
MERGE MLR_REBATE_IBOR_INFO_2 AS target
USING
(
SELECT
@GL_DT
,@SRC_SYS_ID
,@MLR_SRC_SYS_CD
,@TRSRY_FEED_DT
,@Data
) AS source
(
GL_DT
,SRC_SYS_ID
,MLR_SRC_SYS_CD
,TRSRY_FEED_DT
,Data
)
ON (
target.GL_DT = source.GL_DT AND
target.SRC_SYS_ID = source.SRC_SYS_ID AND
target.MLR_SRC_SYS_CD = source.MLR_SRC_SYS_CD AND
target.TRSRY_FEED_DT = source.TRSRY_FEED_DT
)
WHEN MATCHED THEN
UPDATE SET Data = source.Data
WHEN NOT MATCHED THEN
INSERT
(
[GL_DT],
[SRC_SYS_ID],
[MLR_SRC_SYS_CD],
[TRSRY_FEED_DT],
[Data]
)
VALUES
(
[GL_DT], --<<it looks like these can eiether be the variable eg, @GL_DT, or prefixed by 'source.'
[SRC_SYS_ID],
[MLR_SRC_SYS_CD],
[TRSRY_FEED_DT],
[Data]
);
END
创建过程MyMergeTest
@总账日期
,@SRC_SYS_ID char(20)
,@MLR_SRC_SYS_CD char(3)
,@TRSRY\u FEED\u DT日期
,@Data varchar(20)
像
开始
合并MLR\u折扣\u IBOR\u信息\u 2作为目标
使用
(
选择
@甘油三酯
,@SRC_SYS_ID
,@MLR\u SRC\u SYS\u CD
,@TRSRY\u FEED\u DT
,@数据
)作为来源
(
甘油三酯
,SRC_SYS_ID
,MLR_SRC_SYS_CD
,TRSRY_FEED_DT
数据
)
在(
target.GL_DT=source.GL_DT和
target.SRC\u SYS\u ID=source.SRC\u SYS\u ID和
target.MLR\u SRC\u SYS\u CD=source.MLR\u SRC\u SYS\u CD和
target.TRSRY\u FEED\u DT=source.TRSRY\u FEED\u DT
)
当匹配时
更新集数据=source.Data
当不匹配时
插入
(
[GL_DT],
[SRC\u SYS\u ID],
[MLR\U SRC\U系统\U CD],
[TRSRY\u FEED\u DT],
[数据]
)
价值观
(
[GL_DT],--是的,这是合并的一个很好的候选者。这是合并设计用来阻止的单独事务问题。你知道如果不存在可以返回true,但当你点击更新时可以返回false,对吗?如果你进行更新,然后插入IF@@rowcount=0,则相同,尽管这种方法对我来说总是比较干净的(少扫描一次=少阻塞/锁定)。