【问题标题】:Insert from temp table to a table with identity column从临时表插入到具有标识列的表中
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    相反,我建议这样做:

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

    ...又名,明确说明列,并省略 Identity 列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多