【问题标题】:Inserting the Identity of another Insert from Select?从 Select 中插入另一个插入的标识?
【发布时间】:2012-04-27 21:31:15
【问题描述】:

这可能吗?

这是我正在寻找的东西,一起执行:

首先,它将根据 SELECT 中的行数执行 INSERT

  INSERT INTO TABLE2 (xID, NAME)
  SELECT xID, NAME FROM TABLE

然后获取每个 INSERTED ROW 的@@IDENTITY,它将创建一个新的插入,其中包含与第一个 SELECT 语句相同的数据:

  INSERT INTO TABLE3 (xID, NAME, ID)
  SELECT xID, NAME, ID as Scope_IdentitY()

如果没有,不使用 cursor 或 while 的最佳方法是什么?

【问题讨论】:

    标签: sql sql-server sql-server-2008 sql-server-2005


    【解决方案1】:

    你至少有两个选择:

    1) OUTPUT...INTO target_table 子句 (SQL2005+)

    2) 或者你可以写composable DML(SQL2008+)。

    例子:

    DECLARE @Table2 TABLE(
        ID  INT IDENTITY PRIMARY KEY, --IDENTITY 
        xID INT NOT NULL,
        NAME VARCHAR(25) NOT NULL
    );
    
    DECLARE @Table3 TABLE(
        ID  INT PRIMARY KEY, --No IDENTITY 
        xID INT NOT NULL,
        NAME VARCHAR(25) NOT NULL
    );
    
    --First solution: OUTPUT ... INTO
    INSERT  INTO @Table2 (xID, NAME)
    OUTPUT  inserted.xID, inserted.NAME, inserted.ID INTO @Table3(xID, NAME, ID)
    SELECT  t.Col1, t.Col2
    FROM    (SELECT 11,'A' UNION ALL SELECT 22,'B' UNION ALL SELECT 33,'C') AS t(Col1,Col2);
    
    --Second solution: composable DML
    INSERT  INTO @Table3(xID, NAME, ID)
    SELECT  src.xID, src.NAME, src.ID
    FROM
    (
            INSERT  INTO @Table2 (xID, NAME)
            OUTPUT  inserted.xID, inserted.NAME, inserted.ID 
            SELECT  t.Col1, t.Col2
            FROM    (VALUES(44,'D'),(55,'E'),(66,'F')) AS t(Col1,Col2)
    ) src
    
    SELECT * FROM @Table2 
    SELECT * FROM @Table3
    

    【讨论】:

    • 完整性的最佳答案。
    【解决方案2】:
    INSERT INTO TABLE2 (xID, NAME)
    OUTPUT
    INSERTED.xID, INSERTED.NAME, INSERTED.ID
    INTO TABLE3 (xID, NAME, ID)
    SELECT xID, NAME FROM [TABLE]
    

    【讨论】:

      【解决方案3】:

      您可以声明一个表变量并将插入到 dbo.Table2 中的行的输出存储在此变量中,并将表变量用作表 dbo.Table3的输入>.

      CREATE TABLE dbo.Table1
      (
              xid     int NOT NULL
          ,   name    varchar(30) NOT NULL
      );
      
      CREATE TABLE dbo.Table2
      (
              id      int NOT NULL IDENTITY
          ,   xid     int NOT NULL
          ,   name    varchar(30) NOT NULL
      );
      
      CREATE TABLE dbo.Table3
      (
              id      int NOT NULL
          ,   xid     int NOT NULL
          ,   name    varchar(30) NOT NULL
      );
      
      INSERT INTO dbo.Table1 (xid, name) VALUES
          (195, 'abc'),
          (242, 'def'),
          (332, 'ghi');
      GO
      
      DECLARE @tempTable table
          (       id      int
              ,   xid     int
              ,   name    varchar(30)
          );
      
      INSERT dbo.Table2
          OUTPUT INSERTED.id, INSERTED.xid, INSERTED.name
              INTO @tempTable
              SELECT xid, name FROM dbo.Table1;
      
      INSERT dbo.Table3 (id, xid, name) 
          SELECT id, xid, name FROM @tempTable;
      
      SELECT id, xid, name FROM dbo.Table2;
      SELECT id, xid, name FROM dbo.Table3;
      
      GO
      

      【讨论】:

        【解决方案4】:

        好的,根据你下面的 cmets,试试这个:

          INSERT INTO TABLE2 (xID, NAME)
          SELECT xID, NAME FROM TABLE;
        
          INSERT INTO TABLE3 (xID, NAME, ID)
          SELECT xID, NAME, @@identity
          FROM TABLE2;
        

        【讨论】:

        • 你想做什么?您是否要在第一行设置 xID = ID?
        • 我正在尝试将第一个插入的 @@identity 插入到第二个插入中
        • 那是因为您没有尝试选择任何内容...您想在 table3 中插入​​任意行,然后在 table2 中插入第二行,其中 table2.id = table3.xID,对吗?
        • 看看我的编辑,我希望 scope_identity() 成为 Table2 的身份
        【解决方案5】:

        假设这些表结构:

        TABLE_A
        -----------
        X_ID
        NAME
        
        TABLE_B
        ----------------
        TABLE_B_ID [PK]
        X_ID
        NAME
        
        TABLE_C
        ----------------
        TABLE_C_ID [PK]
        X_ID
        NAME
        TABLE_B_ID [FK]

        那么这不可行吗(最好在交易中)?:

        -- Grab data from TABLE_A and INSERT INTO TABLE_B
        INSERT INTO TABLE_B (
            X_ID,
            NAME
        )
        SELECT
            X_ID,
            NAME
        FROM
            TABLE_A
        
        -- Grab data from TABLE_B that matches the data imported from TABLE_A
        -- and INSERT that data into TABLE_C (incl. the PK from TABLE_B)
        
        INSERT INTO TABLE_C (
            X_ID,
            NAME,
            TABLE_B_ID
        )
        SELECT 
            b.X_ID,
            b.NAME,
            b.TABLE_B_ID
        FROM
            TABLE_B b
        INNER JOIN 
            TABLE_A a ON a.X_ID = b.X_ID

        【讨论】:

          猜你喜欢
          • 2021-05-31
          • 1970-01-01
          • 2012-06-23
          • 1970-01-01
          • 2016-02-21
          • 2020-03-17
          • 2011-11-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多