Можем ли мы добавить первичный ключ во временную таблицу при выполнении 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)