代码之家  ›  专栏  ›  技术社区  ›  David

将T1中当前不在T2中的所有行插入T2

  •  0
  • David  · 技术社区  · 7 年前

    我试图将T1中当前不在T2中的所有记录插入T2

    当我从存储过程生成代码作为T2的标识符时,我在循环中进行了尝试

    declare     @Part           VARCHAR(255),
                @GenValue       VARCHAR(255),
                @x              INT
    set @x = (select count(*) from T1)  
    WHILE @x >=0
    
    BEGIN
        EXEC [dbo].[usp_GenInd] @GenValue OUT,@GencCode = 'TKM', @GencIncrement = 1
    
    
         set @Part = @GencValue
    
        INSERT INTO dbo.T2
        SELECT  @Part                           AS  [part],
                [Prod_Code] + Column_Header     AS  [identifier],
                [part_rev]                      =   NULL,
                '!'                             AS  [u_version],
                a.[Descr]                           AS  [descr],
                GETDATE()                       AS  [last_updated],
                'ME'                            AS  [last_upd_user],
                'EA'                            AS  [basic_unit],
                [source]                        =   NULL,
                'MAIN'                          AS  [level_1],
                'GROUP'                         AS  [level_2],
                'ME'                            AS  [user_created],
                '20'                            AS  [status],
                [Prod_Code]                     AS  [master_part],
                [drawing_no]                    =   NULL
    
        FROM [dbo].T1 a
        LEFT JOIN dbo.T2 b
            ON a.Prod_Code + a.Column_Header = b.part
        WHERE b.part is null
    
    END
    

    我一直在错误地说T2上存在主键冲突,这是我从存储过程生成的@part变量。

    速度也很慢,我认为在null的左连接上插入要比游标快。

    T1中只有67行

    谢谢你提前帮忙

    3 回复  |  直到 7 年前
        1
  •  1
  •   SMor    7 年前

    否-如果必须继续使用此存储过程生成主键值,请返回光标。添加到此脚本的逻辑错误是insert语句。它不会从T1中选择特定的行-它会选择T1中不存在于T2中的所有行(假设逻辑正确-我不会对其进行评估)。假设您必须调用过程usp\u GenInd来为T1中的每一行生成PK值。此外,你永远不会减少x,所以你有一个无尽的循环。

    注意措辞“不存在”。通常,我发现当查询匹配(尽可能接近)代码的意图时,更容易理解未记录的逻辑。您的左连接逻辑与不存在的逻辑相同-只是更难理解。此外,在检查连接逻辑是否存在时,也存在一个潜在问题。”AA“+”B“=”A“+”AB“-但列包含不同的值。小心假设。

        2
  •  0
  •   Simone    7 年前

    我会尝试以下方式:

    ;WITH cte AS (
     SELECT  your needed data
     FROM [dbo].T1
     EXCEPT
     SELECT  already existing data
     FROM [dbo].T2
    )
    INSERT INTO dbo.T2
    SELECT *
    FROM cte
    
        3
  •  0
  •   Tab Alleman    7 年前

    您的连接逻辑有缺陷。

    在您的插页中,您有以下内容:

    INSERT INTO dbo.T2
    SELECT  @Part                           AS  [part],
            [Prod_Code] + Column_Header     AS  [identifier],
    

    将@零件插入[零件]

    但是,当您进行连接以排除现有行时,您有以下情况:

       LEFT JOIN dbo.T2 b
            ON a.Prod_Code + a.Column_Header = b.part
    

    要排除现有行,您应该加入 @part=b.part .