【问题标题】:Merge SQL INSERT with Reference Table将 SQL INSERT 与引用表合并
【发布时间】:2012-12-30 00:31:08
【问题描述】:

我需要同步两个表。

表A

Id    Name  

表B

Id  Name RefID --It's a Foreign key, defined as primary key in Table "TableReference"

表格参考

RefID -- Identity Column, auto increment

我需要合并TableATableB,这样每次在TableB 中插入时,都应该将一个值插入到TableReference 中,并且应该将插入的值复制到@ 的RefId 列中987654329@.

我在做什么?

我正在使用 SSIS,因此我需要一个基于 SSIS 的解决方案或基于 SQL 的解决方案。我知道如何使用 Merge SQL 命令合并表,但我无法将值插入TableRef 并将其复制回TableB。无法弄清楚我怎么能做到这一点。 SQL 用户定义函数不允许INSERT 所以我不能使用它。

Merge TabaleB T
Using Table A S
On S.Id=T.Id
WHEN MATCHED THEN
UPDATE
T.ID=S.ID,
T.NAME=S.NAME

WHEN NOT MATCHED BY TARGET THEN

INSERT(S.ID,S.NAME, {Somehow here i need a function call that inserts in TableRef and   Returns SCOPE_IDENTITY})

问题是 T-SQL 函数不允许 INSERT 并且不能在此处调用存储过程,因为 MergeWHEN NOT MATCHED BY TARGET THEN 之后不允许除 INSERT 之外的任何 TSQL 事物。

【问题讨论】:

    标签: sql sql-server-2008 tsql ssis


    【解决方案1】:

    您能否在 TableB 上添加TRIGGER。如果是这样,一种选择是使用INSERTED 行并从那里开始。

    可能是这样的(未经测试):

    CREATE TRIGGER dbo.tr_TableB
    ON dbo.TableB
    FOR INSERT
    AS
    BEGIN
        SET NOCOUNT ON;
    
        INSERT TableReference  DEFAULT VALUES;  
    
        DECLARE @RefId INT;
        SELECT @RefId  = SCOPE_IDENTITY();
    
        UPDATE t1
            SET t1.RefId = @RefId 
        FROM dbo.TableB AS t1 
            INNER JOIN INSERTED AS i
                ON i.Id= t1.Id
    
    END
    GO
    

    祝你好运。

    【讨论】:

    • 触发器只在我执行 MERGE SQL 时运行一次。它不会针对每一行运行。
    • 你是对的——不确定是否使用 MERGE。或者,INSERTED 表仍应存储来自 MERGE 的所有结果。虽然我不喜欢在触发器中使用 CURSOR(或者根本不喜欢),但您可能会遍历 INSERTED 表并相应地插入/更新。只是一个想法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-26
    • 2013-06-02
    • 2021-06-20
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多