我只想从名为LOAD_NO
的表中复制特定的LOADS
,然后将其插回到同一个LOADS
表中,但不使用旧的LOAD_NO
(又名ID
)...
表格名称为LOADS
。
我想复制一个特定的行并将其插入表中,但不需要指定所有字段(因为该表有很多字段)
我需要排除名为LOAD_NO
然后删除旧行
我试过这样的事情:
我克隆了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
的外观:
我得到的错误如下:
Msg 8101,Level 16,State 1,Line 3
只有在使用列列表且IDENTITY_INSERT为ON时,才能指定表'LOADS'中标识列的显式值。
我试图添加:
set identity_insert LOADS OFF
GO
以及
set identity_insert LOADS ON
GO
我总是得到同样的错误。
感谢任何帮助:)
答案 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;