Я хочу иметь возможность вставлять данные из таблицы со столбцом идентификации во временную таблицу в SQL Server 2005.
TSQL выглядит примерно так:
-- Create empty temp table
SELECT *
INTO #Tmp_MyTable
FROM MyTable
WHERE 1=0
...
WHILE ...
BEGIN
...
INSERT INTO #Tmp_MyTable
SELECT TOP (@n) *
FROM MyTable
...
END
Приведенный выше код создал #Tmp_Table со столбцом идентификаторов, а вставка впоследствии завершается с ошибкой «Явное значение для столбца идентификаторов в таблице« #Tmp_MyTable »можно указывать только в том случае, если используется список столбцов, а IDENTITY_INSERT установлен в ON . "
Есть ли в TSQL способ удалить свойство идентификации столбца во временной таблице без явного перечисления всех столбцов ? Я специально хочу использовать «SELECT *», чтобы код продолжал работать, если в MyTable будут добавлены новые столбцы.
Я полагаю, что удаление и воссоздание столбца изменит его положение, делая невозможным использование SELECT *.
Обновление:
Я пытался использовать IDENTITY_INSERT, как предложено в одном ответе. Это не работает - см. Репродукцию ниже. Что я делаю не так?
-- Create test table
CREATE TABLE [dbo].[TestTable](
[ID] [numeric](18, 0) IDENTITY(1,1) NOT NULL,
[Name] [varchar](50) NULL,
CONSTRAINT [PK_TestTable] PRIMARY KEY CLUSTERED
(
[ID] ASC
)
)
GO
-- Insert some data
INSERT INTO TestTable
(Name)
SELECT 'One'
UNION ALL
SELECT 'Two'
UNION ALL
SELECT 'Three'
GO
-- Create empty temp table
SELECT *
INTO #Tmp
FROM TestTable
WHERE 1=0
SET IDENTITY_INSERT #Tmp ON -- I also tried OFF / ON
INSERT INTO #Tmp
SELECT TOP 1 * FROM TestTable
SET IDENTITY_INSERT #Tmp OFF
GO
-- Drop test table
DROP TABLE [dbo].[TestTable]
GO
Обратите внимание, что сообщение об ошибке "Явное значение для столбца идентификаторов в таблице '#TmpMyTable' может быть указано только , когда используется список столбцов и IDENTITY_INSERT включен." - Я специально не хочу использовать список столбцов, как описано выше.
Обновление 2
Попробовал предложение от Майка , но это дало ту же ошибку:
-- Create empty temp table
SELECT *
INTO #Tmp
FROM (SELECT
m1.*
FROM TestTable m1
LEFT OUTER JOIN TestTable m2 ON m1.ID=m2.ID
WHERE 1=0
) dt
INSERT INTO #Tmp
SELECT TOP 1 * FROM TestTable
Что касается того, почему я хочу сделать это: MyTable - это промежуточная таблица, которая может содержать большое количество строк, которые нужно объединить в другую таблицу. Я хочу обработать строки из промежуточной таблицы, вставить / обновить основную таблицу и удалить их из промежуточной таблицы в цикле, который обрабатывает N строк на транзакцию. Я понимаю, что есть и другие способы достичь этого.
Обновление 3
Я не смог заставить решение Майка работать, однако он предложил следующее решение, которое действительно работает: префикс с не идентифицирующим столбцом и удаление столбца идентификаторов:
SELECT CAST(1 AS NUMERIC(18,0)) AS ID2, *
INTO #Tmp
FROM TestTable
WHERE 1=0
ALTER TABLE #Tmp DROP COLUMN ID
INSERT INTO #Tmp
SELECT TOP 1 * FROM TestTable
Предложение Майка хранить только ключи во временной таблице также является хорошим, хотя в этом конкретном случае есть причины, по которым я предпочитаю иметь все столбцы во временной таблице.