Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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 2008 需要将INSERT\UPDATE转换为MERGE的帮助吗_Sql Server 2008_Tsql - Fatal编程技术网

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,则相同,尽管这种方法对我来说总是比较干净的(少扫描一次=少阻塞/锁定)。