1

在 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才能使其正常工作。在我们所处的情况下,我们无法访问列名,只能访问需要复制的表列表。有没有办法绕过这个限制?

4

1 回答 1

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
于 2011-01-12T20:44:48.963 回答