Задать вопрос
@stainer

Что не так с запросом T-SQL?

Добрый день, не могу понять, в чем ошибка запроса.
Запрос:

SELECT * INTO #temp_MarkaAutos_1644569816 FROM MarkaAutos WHERE 1<>1; --создаем временную таблицу из существующей (структура)

SET IDENTITY_INSERT #temp_MarkaAutos_1644569816 ON; --разрешаем вставку рк временной
SET IDENTITY_INSERT MarkaAutos ON; --разрешаем вставку рк

INSERT INTO #temp_MarkaAutos_1644569816 (id,name,icon,slug,rusName) VALUES ('1','Acura','.jpg','acura','Акура');

MERGE INTO MarkaAutos AS t 
USING #temp_MarkaAutos_1644569816 AS t2 
ON 1=2 
WHEN MATCHED THEN 
	UPDATE SET name = t2.name,icon = t2.icon,slug = t2.slug,rusName = t2.rusName 
WHEN NOT MATCHED THEN 
	INSERT (id,name,icon,slug,rusName) VALUES (t2.id,t2.name,t2.icon,t2.slug,t2.rusName);

SET IDENTITY_INSERT MarkaAutos OFF; --отключаем вставку рк

DROP TABLE #temp_MarkaAutos_1644569816; --удаляем временную таблицу


Ошибка:

SQL (8107): IDENTITY_INSERT is already ON for table 'tempdb.dbo.#temp_MarkaAutos_1644569816'. Cannot perform SET operation for table 'MarkaAutos'.uery


При этом, если я уберу из запроса разрешение на вставку РК во временную таблицу, то ошибка о том, что нельзя вставить РК т.к. IDENTITY_INSERT is OFF.
  • Вопрос задан
  • 50 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
@stainer Автор вопроса
Нашел костыль в гуглах, может кому пригодится:

SELECT * INTO #temp_MarkaAutos_1644569816 FROM MarkaAutos WHERE 1<>1
UNION ALL
SELECT * FROM MarkaAutos where 1 = 0;

SET IDENTITY_INSERT MarkaAutos ON; --разрешаем вставку рк

INSERT INTO #temp_MarkaAutos_1644569816 (id,name,icon,slug,rusName) VALUES ('1','Acura','.jpg','acura','Акура');

MERGE INTO MarkaAutos AS t 
USING #temp_MarkaAutos_1644569816 AS t2 
ON 1=2
WHEN MATCHED THEN 
	UPDATE SET name = t2.name,icon = t2.icon,slug = t2.slug,rusName = t2.rusName 
WHEN NOT MATCHED THEN 
	INSERT (id,name,icon,slug,rusName) VALUES (t2.id,t2.name,t2.icon,t2.slug,t2.rusName);

SET IDENTITY_INSERT MarkaAutos OFF; --отключаем вставку рк

DROP TABLE #temp_MarkaAutos_1644569816; --удаляем временную таблицу
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы