Можем ли мы добавить первичный ключ во временную таблицу при выполнении select * в #temp_table?

В хранимой процедуре мы сначала усекаем таблицу фактов, а затем вставляем данные. Хранимая процедура в любом случае сначала усекает таблицу, поэтому при наличии дубликатов при вставке данных в таблицу хранимая процедура завершается ошибкой из-за первичного ключа.

TRUNCATE TABLE FactIncident

INSERT INTO FactIncident
    SELECT * FROM Source_table

Таким образом, у нас нет данных в таблице в конце. Так что я подумал о том, чтобы сначала загрузить данные во временную таблицу с первичным ключом, делая

SELECT * INTO #temp_table

а затем обрезать и загрузить данные из временной таблицы в фактическую таблицу фактов. Можно ли добавить первичный ключ при выполнении select * into #temp_table вместо создания первичного ключа путем определения create table #temp_table синтаксис?

4 ответа

Если вы делаете это, чтобы избежать ошибок при вставке дубликатов, можете ли вы просто игнорировать дубликаты?

TRUNCATE TABLE FactIncident

ALTER TABLE [FactIncident] REBUILD WITH (IGNORE_DUP_KEY = ON)
INSERT INTO [FactIncident] SELECT * FROM Source_table
ALTER TABLE [FactIncident] REBUILD WITH (IGNORE_DUP_KEY = OFF)

Я думаю, вам нужен столбец идентичности:

select identity(1,1) as ID, * into #temp_table
from table t;

Тогда вы можете пойти с:

IF OBJECT_ID('TempDB..#temp_table') IS NOT NULL 
DROP TABLE #temp_table

CREATE TABLE #temp_table (Col1 INT PRIMARY KEY CLUSTERED, Col2 varchar(255), ... Col3)

Пока недоступно. Потому что определение таблицы будет создано внутри движка базы данных. Рекомендую не использовать такой T-SQL.

 SELECT * INTO #Temp FROM YourTable

несовместим с SQL Azure. Сначала нужно создать определение объекта временной таблицы, где вы также можете создать столбец первичного ключа.

Нет, я не думаю, что вы можете иметь первичный ключ при выполнении insert into временная таблица.

Но если вы не хотите создавать временную таблицу, вы все равно можете объявить переменную Table и использовать ее. Посмотрите на этот пример

declare @temp_table table (ID int primary key, name varchar(10))

insert into @temp_table values (1, 'Angela')
insert into @temp_table values (1, 'Jessica')

Вторая вставка не удастся из-за первичного ключа на временную таблицу

Нарушение ограничения PRIMARY KEY 'PK__#BD5C289__3214EC270D19E213'. Невозможно вставить дубликат ключа в объект 'dbo.@ Temp_table'. Дубликат значения ключа (1)

РЕДАКТИРОВАТЬ:
Альтернативой может быть изменение искушаемого после select into и добавить ограничение первичного ключа для столбца Pcolumn,
Если добавить первичный ключ не удается, вы знаете, что у вас есть дубликаты.

alter table #tempuser add constraint PK_TempPcolumn primary key (Pcolumn)
Другие вопросы по тегам