代码之家  ›  专栏  ›  技术社区  ›  Haoest

插入…选择*,如何忽略标识?

  •  11
  • Haoest  · 技术社区  · 16 年前

    我有一个混凝土工作台的精确结构的临时工作台 T . 它是这样创建的:

    select top 0 * into #tmp from T
    

    处理后,将内容填入 #tmp ,我想将内容复制回 T 这样地:

    insert into T select * from #tmp
    

    只要这样就可以了 T 没有标识列,但在我的例子中是这样。有什么方法可以忽略自动递增标识列吗 γ-TMP 当我复制到 T ?我的动机是避免在插入列表中拼写出每一个列名。

    编辑:切换标识插入不起作用,因为pkey γ-TMP 可能会与 T 如果行插入 T 在我的剧本之外,如果 γ-TMP 已自动增加pkey以与t同步。

    9 回复  |  直到 6 年前
        1
  •  8
  •   Andriy M    12 年前

    由于标识将在插入过程中生成,在将数据插入回T之前,您可以简单地从tmp中删除此列吗?

    alter table #tmp drop column id
    

    UPD: 下面是我在SQL Server 2008中测试的一个示例:

    create table T(ID int identity(1,1) not null, Value nvarchar(50))
    insert into T (Value) values (N'Hello T!')
    select top 0 * into #tmp from T
    alter table #tmp drop column ID
    insert into #tmp (Value) values (N'Hello #tmp')
    insert into T select * from #tmp
    drop table #tmp
    select * from T
    drop table T
    
        2
  •  13
  •   Orion Adrian    16 年前

    设置标识插入

    插入命令

    设置标识插入关闭

        3
  •  3
  •   sǝɯɐſ    7 年前

    见答案 here here :

    select * into without_id from with_id
    union all
    select * from with_id where 1 = 0
    

    原因:

    在新表中选择现有标识列时,除非满足以下条件之一,否则新列将继承标识属性:

    • select语句包含join、group by子句或aggregate函数。
    • 使用union连接多个select语句。
    • 标识列在选择列表中多次列出。
    • 标识列是表达式的一部分。
    • 标识列来自远程数据源。

    如果这些条件中的任何一个为真,则创建的列不是空列,而不是继承Identity属性。如果新表中需要标识列,但该列不可用,或者需要与源标识列不同的种子值或增量值,请使用标识函数在选择列表中定义该列。请参见下面的示例部分中的“使用标识函数创建标识列”。

    所有功劳归 Eric Humphrey bernd_k

        4
  •  1
  •   Cade Roux    16 年前

    不与 SELECT * -如果您选择了除标识之外的每一列,那就没问题了。我能看到的唯一方法是通过动态构建 INSERT 语句。

        5
  •  1
  •   HLGEM    16 年前

    只需列出要重新插入的列,就不应该使用select*。如果不想键入,只需从对象浏览器中拖动它们(如果展开表并拖动单词、列,则会得到所有列,只需删除ID列)。

        6
  •  0
  •   BCS    16 年前

    是否可以“更新t.id=tmp.id”的工作位置?

        7
  •  0
  •   Rob Packwood    15 年前

    插入表格 选择max(id)+row_number()over(order by id)

        8
  •  0
  •   Chuck Norris Rohidas Kadam    13 年前
    set identity_insert on
    

    用这个。

        9
  •  -1
  •   Nick    16 年前
    1. 它让我有机会在插入之前预览数据
    2. 作为计算的一部分,我在临时表之间建立了连接;临时表使我能够将精力集中在我正在处理的确切的集合数据上。我想就是这样。有什么建议/意见吗?

    对于第1部分,正如Kolten在其中一条注释中提到的,将语句封装在事务中,并添加一个参数来在显示和提交之间切换,这将满足您的需求。对于第2部分,我需要看看您正在尝试什么“计算”。将数据限制在临时表中可能会使情况变得过于复杂。