【发布时间】:2017-03-21 19:08:57
【问题描述】:
我正在从表中获取一些行,在临时表中对其进行操作,然后将它们作为新行插入到我的原始表中。
但是,即使我的临时表上没有标识列,我也遇到了标识列的问题。标识列是一个自动递增的 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 为 ON 时,才能为表“OriginalTable”中的标识列指定显式值。
我绝对不想设置一个明确的值,我希望它插入并给我新的身份(通过@InsertedRows)
【问题讨论】:
-
不要使用 select * 作为你的值。您需要明确说明列。在您的情况下,这是失败的,因为解析器不会对每个步骤进行逻辑评估。它仍然认为 MyIdentityColumn 是 #TestTable 的列,并认为您正在尝试插入它。在你的代码中明确。在用于值的插入语句和选择语句中指定列。
-
@SeanLange 有没有动态的方法来做到这一点?我可以从没有 ident 列的架构中选择列名并使用它而不是
*还是我真的坚持将它们全部列出来? -
您应该始终列出列。如果是大量列,您可以将 SSMS 中的列“文件夹”拖到查询窗口中。除了明确列出的列之外的任何内容都是惰性的,并且在表更改时容易出错。
-
@RandyHall 除了 Sean Lange 的另一个提示:如果您要加入许多表,您可以添加一个短表别名(FROM MYTABLE AS M),然后在别名后面写点name intellisense 将显示可用列的列表,您可以使用箭头插入这些列以选择 + 输入键
标签: sql-server tsql insert identity-column