我有一个包含大约20列的表格,我希望复制一条记录。我可以这样做:
INSERT INTO [Table] (ColumnA, ColumnB, ColumnC, .... ColumnZ)
SELECT TOP 1 ColumnA, ColumnB, ColumnC, .... ColumnZ
FROM [Table]
WHERE ID=@ID
但是,这将非常耗时,如果将来在表中添加新列,我希望自动复制该列。因此,我正在寻找一些方法:
INSERT INTO [Table]
SELECT TOP 1 * (apart from identity)
FROM [Table]
WHERE ID=@ID
这可能吗?
答案 0 :(得分:3)
SQL Server不提供任何类型的“select * except for identity”功能,您必须通过指定每一列来自己编写。如果表的列定义会随着时间的推移而改变(添加,重命名或删除列),那么唯一的方法是使用动态代码,根据object_kd = object_id('YourTable)的sys.columns内容构建insert语句'),如果存在标识列,则排除标识列。对于我的钱,如果添加列,最好查看并更新引用该表的代码。
哦,如果ID是主键,则不需要top 1
。
答案 1 :(得分:1)
一种方法,但会抓住所有列
SELECT TOP 1 *
INTO [NewTable]
FROM [Table]
WHERE ID=@ID
你的另一个选择是动态SQL,从information_schema.columns
构建列列表,跳过带有identity的列表,然后执行动态sql