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

不带列名列表的tsql标识插入

  •  5
  • David  · 技术社区  · 14 年前

    我将把一些数据从一个数据库转储到另一个数据库。我正在使用

    set identity_insert MyTable on
    GO
    INSERT INTO MyTable SELECT * FROM sourceDB.dbo.MyTable
    GO
    set identity_insert MyTable off
    

    编辑:

    4 回复  |  直到 14 年前
        1
  •  4
  •   Bernard Vander Beken Harald Coppoolse    5 年前

    只需从对象浏览器拖放列名。你可以只做一步,这比写select*要多花大约1秒的时间,而且无论如何你都不应该在生产代码中使用select*。这是一个糟糕的做法。

    我很担心你插入的身份列,但这是一件事,几乎永远不应该这样做。如果原始表的某些标识列与新表中的现有标识相同,该怎么办?在决定从另一个表中插入id值之前,请确保对此进行检查。我更喜欢对父表执行插入操作,获得一个新的id并将其与旧的id相匹配(2008年的输出对此很有用),然后对任何子表使用新的id,但对旧的id进行连接。

        2
  •  3
  •   p.campbell    14 年前

    刚刚在SQLServer2000SP2机器上尝试了这个场景,我收到了这个错误,似乎证实了您的观察结果。

    set identity_insert Foo2 on
    GO
    INSERT INTO Foo2 select top 100 * from Foo where id > 110000
    GO
    set identity_insert Foo2 off
    

    这个 SELECT INTO 建议只会有助于将数据放入暂存表。在某些时候,您必须显式地声明列名。

    列名提示: 在SSMS查询中高亮显示该表,然后按Alt-F1(查询的快捷方式) sp_help ). 然后可以复制/粘贴结果 column_name 在查询中,只需手动添加逗号。将快捷方式再进一步,将它们粘贴到Excel中,键入一个逗号,然后向下复制列。

        3
  •  1
  •   John Chase    6 年前

    select outside.TABLE_NAME,
           stuff((select ',' + COLUMN_NAME
                    from INFORMATION_SCHEMA.COLUMNS as inside
                   where inside.TABLE_NAME = outside.TABLE_NAME
                   order by ORDINAL_POSITION
                     for xml path('')), 1, 1, '') as column_list
      from INFORMATION_SCHEMA.COLUMNS as outside
     where TABLE_NAME in (select table_name from dbo.undo)
     group by TABLE_NAME
    

    然后我将输出复制到Excel,并使用ye olde=CONCATENATE函数生成所有的IDENTITY\u INSERT和INSERT INTO语句,复制/粘贴回SSMS,瞧!是的,Excel是你的朋友。

        4
  •  0
  •   JNK    14 年前

    如果不需要保留ID列的值,可以:

    删除ID列

    在新目标数据库的新架构中创建一个ID列(使其成为列列表中的最后一列)

    INSERT INTO newdb.dbo.newtable
    SELECT * FROM olddb.dbo.oldtable