1

SQL Server ではINSERT、次のステートメントを使用して、あるテーブルから別のテーブルにすべてのデータを移動する機能があります。

INSERT INTO TABLE1 SELECT * FROM TABLE2

ID 列を持つテーブルでこれを実行すると、コマンドを実行したにもかかわらず、次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 に答える