Sql server 从临时表插入到具有标识列的表

Sql server 从临时表插入到具有标识列的表,sql-server,tsql,insert,identity-column,Sql Server,Tsql,Insert,Identity Column,我从一个表中抓取一些行,在临时表中处理它们,然后将它们作为新行插入到原始表中 然而,我遇到了标识列的问题,即使我的临时表中没有标识列。标识列是一个自动递增的int 这似乎是一件简单的事情,我想得太多了 select top 0 * into #TestTable from OriginalTable; ... --insert and manipulate records ... ALTER TABLE #TestTable DROP COLUMN MyIdentityColumn; DE

我从一个表中抓取一些行,在临时表中处理它们,然后将它们作为新行插入到原始表中

然而,我遇到了标识列的问题,即使我的临时表中没有标识列。标识列是一个自动递增的int

这似乎是一件简单的事情,我想得太多了

select top 0 *
into #TestTable
from OriginalTable;

...
--insert and manipulate records
...

ALTER TABLE #TestTable
DROP COLUMN MyIdentityColumn;

DECLARE @InsertedRows TABLE (NewSeqNum INT);

INSERT INTO OriginalTable
OUTPUT MyIdentityColumn INTO @InsertedRows(NewSeqNum)
SELECT * FROM #TestTable
但我得到了这个错误:

只有在使用列列表且启用identity_INSERT时,才能为表“Originatable”中的标识列指定显式值


我绝对不想设置显式值,我希望它通过@InsertedRows插入并给我新的标识。如果您不想保留插入记录的id,那么您需要在select中指定除id列之外的所有列。一般良好做法是,不要选择*,始终指定要检索的列

INSERT INTO OriginalTable (col1, col2, col3...)
OUTPUT MyIdentityColumn INTO @InsertedRows(NewSeqNum)
SELECT (col1, col2, col3...) FROM #TestTable

如果不想保留插入记录的id,则需要在select中指定除id列之外的所有列。一般良好做法是,不要选择*,始终指定要检索的列

INSERT INTO OriginalTable (col1, col2, col3...)
OUTPUT MyIdentityColumn INTO @InsertedRows(NewSeqNum)
SELECT (col1, col2, col3...) FROM #TestTable

如果我理解您的意思,我认为您的问题在于您试图将“*”插入到原始表中,这意味着临时表中的所有列。包括您不想插入的ID列,因为您希望它自动生成

相反,我建议这样做:

Select [ColumnB],[ColumnC],[ColumnD],[Etc] into your temp table

Select [ColumnB],[ColumnC],[ColumnD],[Etc] into your original table.

。。。aka,显式拼写列,省略标识列。

如果我理解您的意思,我认为您的问题在于您试图将“*”插入原始表中,这意味着临时表中的所有列。包括您不想插入的ID列,因为您希望它自动生成

相反,我建议这样做:

Select [ColumnB],[ColumnC],[ColumnD],[Etc] into your temp table

Select [ColumnB],[ColumnC],[ColumnD],[Etc] into your original table.

。。。aka,明确地拼写出列,并省略标识列。

不要使用select*作为值。您需要显式地声明这些列。在您的例子中,这是失败的,因为解析器没有逻辑地计算每个步骤。它仍然认为MyIdentityColumn是TestTable的一列,并且认为您正在尝试插入它。在代码中要明确。在insert语句和select语句中指定要用于值的列。@SeanLange是否有一种动态方法可以做到这一点?我是否可以从模式sans the ident列中选择列名,并使用它而不是*或者我真的无法将它们全部列出?您应该始终列出这些列。如果是大量列,可以将SSMS中的columns文件夹拖动到查询窗口。除了显式列出的列之外的任何内容都是惰性的,并且在表更改时容易出错。@RandyHall除了Sean Lange之外的另一个技巧:如果要连接多个表,可以从MYTABLE中添加一个短表别名M,然后,只要您在别名后面写上点,intellisense就会显示可用列的列表,您可以使用箭头选择+输入键插入这些列。不要使用select*作为您的值。您需要显式地声明这些列。在您的例子中,这是失败的,因为解析器没有逻辑地计算每个步骤。它仍然认为MyIdentityColumn是TestTable的一列,并且认为您正在尝试插入它。在代码中要明确。在insert语句和select语句中指定要用于值的列。@SeanLange是否有一种动态方法可以做到这一点?我是否可以从模式sans the ident列中选择列名,并使用它而不是*或者我真的无法将它们全部列出?您应该始终列出这些列。如果是大量列,可以将SSMS中的columns文件夹拖动到查询窗口。除了显式列出的列之外的任何内容都是惰性的,并且在表更改时容易出错。@RandyHall除了Sean Lange之外的另一个技巧:如果要连接多个表,可以从MYTABLE中添加一个短表别名M,然后,只要您在别名后面写上点,intellisense就会显示可用列的列表,您可以使用箭头选择+回车键插入这些列