Я хочу, чтобы иметь возможность вставлять данные из таблицы со столбцом идентификаторов во временную таблицу в SQL Server 2005.Как упасть IDENTITY свойство столбца в 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 ВКЛЮЧЕНА. "
Есть ли способ в TSQL удалить свойство идентификации столбца во временной таблице без перечисления всех столбцов явно? Я специально хочу использовать «SELECT *», чтобы код продолжал работать, если новые столбцы добавлены в MyTable.
Я считаю, что падение и воссоздание колонки изменят свое положение, что делает невозможным использование SELECT *.
Update:
Я попытался с помощью 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 ВКЛ.» - Я специально не хочу использовать список столбцов, как описано выше.
Update 2 Пробовал the suggestion from Mike но это дало ту же ошибку:
-- 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 строк на транзакцию. Я понимаю, что есть другие способы добиться этого.
Update 3
Я не мог заставить Mike's solution работать, однако он предложил следующее решение, которое делает работу: префикс столбца неединичного и уронить столбец идентификаторов:
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
Предложение Майка хранить только ключи во временной таблице также является хорошим, хотя в этом конкретном случае есть причины, по которым я предпочитаю иметь все столбцы во временной таблице.
это работает для меня, видеть меня ответ ... –
вас решение в обновлении 3 отлично подходит для меня. Я пытался получить OUTPUT of UPDATE во временную таблицу без указания колонок (около 100!) – apc