SQL Server:将行和插入复制到同一个表但具有不同的ID

时间:2014-07-30 21:20:01

标签: sql sql-server

我只想从名为LOAD_NO的表中复制特定的LOADS,然后将其插回到同一个LOADS表中,但不使用旧的LOAD_NO(又名ID)...

表格名称为LOADS

  1. 我想复制一个特定的行并将其插入表中,但不需要指定所有字段(因为该表有很多字段)

  2. 我需要排除名为LOAD_NO

  3. 的字段
  4. 然后删除旧行

  5. 我试过这样的事情:

    我克隆了LOADS表而没有克隆数据,我将该表命名为LOADS_TempTable并添加了LOAD_NO种子开头的身份:11600

    SELECT * 
    INTO LOADS_TempTable 
    FROM LOADS WHERE LOAD_NO = 200;
    
    ALTER TABLE LOADS_TempTable DROP COLUMN LOAD_NO;
    
    INSERT INTO LOADS 
       SELECT * 
       FROM LOADS_TempTable;
    
    DELETE FROM LOADS 
    WHERE LOAD_NO = 200;
    

    以下是表LOAD_NO中列LOADS的外观:

    enter image description here

    我得到的错误如下:

      

    Msg 8101,Level 16,State 1,Line 3
      只有在使用列列表且IDENTITY_INSERT为ON时,才能指定表'LOADS'中标识列的显式值。

    我试图添加:

    set identity_insert LOADS OFF
    GO
    

    以及

    set identity_insert LOADS ON
    GO
    

    我总是得到同样的错误。

    感谢任何帮助:)

3 个答案:

答案 0 :(得分:5)

由于LOAD_NO标识列,因此在插入时不应为其指定值。因此,您需要将我们的INSERT声明修改为包含LOAD_NO列 - 如下所示:

INSERT INTO LOADS(col1, col2, ..., colN)  -- all columns *EXCEPT* LOAD_NO
   SELECT col1, col2, ...., colN          -- all columns *EXCEPT* LOAD_NO 
   FROM LOADS_TempTable;

SQL Server会自动为您要插入的行分配一个新的LOAD_NO - 毕竟,这是身份的作业 专栏!

答案 1 :(得分:1)

试试这个:

set identity_insert LOADS ON
Update LOADS set Load_No = (select max(load_no) + 1 from loads) where load_no = 200
set identity_insert LOADS OFF

您可能还希望将其包装在事务中。

答案 2 :(得分:1)

有:

INSERT INTO LOADS 
SELECT * --now begins from the second column, you drop the first column.
FROM LOADS_TempTable;

是一样的:

INSERT INTO LOADS VALUES(Load_No, second_colum, n_column)
SELECT second_colum, n_column
FROM LOADS_TempTable;

您正在尝试将second_column值插入first_column(Load_No),以免出错。

解决方案:

INSERT INTO LOADS VALUES(second_colum, n_column)
SELECT * -- or: SELECT second_colum, n_column 
FROM LOADS_TempTable;