Копировать всю строку, исключая столбец идентификатора - PullRequest
0 голосов
/ 06 ноября 2019

Я пытаюсь вставить новую строку в таблицу, которая является точной копией другой строки, за исключением идентификатора. Раньше у меня не было проблемы, потому что был ID-столбец, который не заполнялся автоматически. Таким образом, я мог бы просто скопировать строку, подобную этой

INSERT INTO table1 SELECT * FROM table1 WHERE Id = 5

, а затем вручную изменить идентификатор следующим образом:

WITH tbl AS (SELECT ROW_NUMBER() OVER (PARTITION BY Id ORDER BY Id) AS RNr, Id
FROM table1 WHERE Id = 5 
UPDATE tbl SET Id = (SELECT MAX(Id) FROM table1) + 1 
WHERE RNr = 2

Недавно идентификатор столбца изменился, чтобы не заполняться вручную (что я такжекак лучше). Но это приводит к ошибке, которую я, очевидно, не могу заполнить в этом столбце, в то время как IDENTITY_INSERT имеет значение false. К сожалению, я не имею права использовать SET IDENTITY_INSERT IdentityTable ON/OFF до и после заявления, которое я также хотел бы избежать в любом случае.

Я ищу способ вставить всю строку, исключая столбец Id, без указания имен столбцов в выражении INSERT и SELECT (что довольно много).

Ответы [ 2 ]

1 голос
/ 06 ноября 2019

В приведенном ниже коде максимальное значение идентификатора добавляется на единицу, поэтому ваша целостность не нарушается.

insert into table1 
select a.Top_ID, Column2, Column3, ColumnX 
from table1 t1
outer apply (select max(id_column) + 1as Top_ID from table1) as a 
where t1.Id = 1
0 голосов
/ 06 ноября 2019

Хорошо, я нашел способ, используя временную таблицу

SELECT * INTO #TmpTbl
FROM table1 WHERE Id = 5;
ALTER TABLE #TmpTbl
DROP COLUMN Id;
INSERT INTO table1 SELECT * FROM #TmpTbl;
DROP TABLE #TmpTbl
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...