SQL合并输出子句错误

时间:2017-11-09 16:55:57

标签: sql tsql merge-statement output-clause

我有三张桌子:

  1. 源表
  2. ODS表
  3. 临时表
  4. 我的merge语句使用源表将数据插入ODS并将输出插入Staging表。插入后,源表和ODS的计数是相同的,但是,分段计数小于两者。输出子句应该将正在ODS中插入的内容的副本插入到暂存中,但事实并非如此。有人知道为什么会这样吗?我的合并声明如下: -

    BEGIN TRANSACTION
    BEGIN TRY
    /* truncate staging table */
    TRUNCATE TABLE stage table 
    
    /* merge into ODS based on NK */
    MERGE INTO ODS table as TRG
    USING source table as SRC
    /* ON Natural Key for that table/data type */
        ON TRG.column = SRC.column
    
    /* insert new records into ODS */
    WHEN NOT MATCHED AND SRC.column = @LOB THEN
        INSERT (columns )
        VALUES ( columns )
    
    OUTPUT INSERTED.* INTO STG. table
    
    COMMIT TRANSACTION
    

    谢谢!

2 个答案:

答案 0 :(得分:0)

您可能需要;

BEGIN TRANSACTION

BEGIN TRY
/* truncate staging table */
TRUNCATE TABLE stage table ;

/* merge into ODS based on NK */
MERGE INTO ODS table as TRG
USING source table as SRC
/* ON Natural Key for that table/data type */
    ON TRG.column = SRC.column

/* insert new records into ODS */
WHEN NOT MATCHED AND SRC.column = @LOB THEN
    INSERT (columns )
    VALUES ( columns )

OUTPUT INSERTED.* INTO STG.table;

COMMIT TRANSACTION;

来自Merge doc

  

MERGE语句需要使用分号(;)作为语句终止符。

同样OUTPUT INSERTED.* INTO STG.table;是一个巨大的反模式,*并且没有定义列列表

output inserted.col1, inserted.col2 INTO stg.table(col1_name, col2_name)

答案 1 :(得分:0)

SQL合并输出子句错误

问题是变量@LOB是一个存储过程变量,因此每当我通过LOB运行存储过程时,它都会截断先前LOB数据的登台表,因此登台表的数据少于源和目标table.It现在已经解决了。