Копирование данных из одной таблицы SQL Server в другую в той же базе данных без указания столбцов - PullRequest
1 голос
/ 12 января 2011

В 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, чтобыэто работать правильно.В ситуации, в которой мы находимся, у нас нет доступа к именам столбцов, только список таблиц, которые нам нужно скопировать.Есть ли способ обойти это ограничение?

1 Ответ

4 голосов
/ 12 января 2011

Вы можете динамически построить инструкцию 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
...