在SQL Server中,可以使用以下语句INSERT
将一个表中的所有数据转换为另一个表:
INSERT INTO TABLE1 SELECT * FROM TABLE2
在带有标识列的表上运行它时,即使我们运行了命令SET IDENTITY_INSERT TABLE1 ON
,我们也会收到错误:
An explicit value for the identity column in table can only be specified when a column list is used and IDENTITY_INSERT is ON
这意味着我们必须列出INSERT
中的所有列才能使其正常工作。在我们所处的情况下,我们无权访问列名,只能访问我们需要复制的表的列表。有没有办法解决这个限制?
答案 0 :(得分:4)
您可以通过查询数据字典在运行时动态构建SQL语句,如下所示:
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Your_Table'
您可以使用它来动态构建SQL语句来执行此插入,并且它将包含其中的所有列。
您可以在T-SQL
过程中执行上述操作,并且可以使用sp_executesql
来运行动态构建的查询。例如,如果您的查询位于名为@SQL
的变量中,则可以执行以下操作:
EXECUTE sp_executesql @SQL
下面给出了一个例子:
create table three (id int identity, other int)
create table four (id int identity, other int)
insert into three select 1
insert into three select 2
declare @sql nvarchar(max)
set @sql = REPLACE(
'
set identity_insert four on
insert into four (:columns:) select :columns: from three
set identity_insert four off',
':columns:',
stuff((
select ','+quotename(name)
from sys.columns
where object_id=object_id('four')-- and is_identity=0
for xml path('')),1,1,''))
EXECUTE sp_executesql @SQL