Многократные вставки T-SQL с вычисленным первичным ключом - PullRequest
1 голос
/ 25 января 2012

Я написал скрипт против SQL 2008, который работал нормально:

INSERT INTO ITEM_TABLE VALUES((SELECT ISNULL(MAX(PK_COLUMN),0) + 1
FROM ITEM_TABLE), 'Data 1', @HeadSeq)
INSERT INTO ITEM_TABLE VALUES((SELECT ISNULL(MAX(PK_COLUMN),0) + 1
FROM ITEM_TABLE), 'Data 2', @HeadSeq)
...
INSERT INTO ITEM_TABLE VALUES((SELECT ISNULL(MAX(PK_COLUMN),0) + 1
FROM ITEM_TABLE), 'Data 73', @HeadSeq)

Однако в 2005 году она выдает эту ошибку для каждой строки:

Подзапросы не допускаются в этом контексте. Допускаются только скалярные выражения.

Есть ли лучший способ решить эту проблему, а не делать следующее? (что усложнило бы прорезь в середине)

DECLARE @SequenceCounter INT
SELECT @SequenceCounter = ISNULL(MAX(PK_COLUMN),0) FROM ITEM_TABLE

INSERT INTO ITEM_TABLE VALUES(@SequenceCounter + 1, 'Data 1', @HeadSeq)

INSERT INTO ITEM_TABLE VALUES(@SequenceCounter + 2, 'Data 2', @HeadSeq)
...
INSERT INTO ITEM_TABLE VALUES(@SequenceCounter + 73, 'Data 73', @HeadSeq)

Я знаю, что это необходимо решить, сначала вставив данные в таблицу с автоматическим первичным ключом, а затем перенеся данные из одной таблицы в другую, я ищу лучшее решение "только для сценариев".

Спасибо

Lee

1 Ответ

3 голосов
/ 25 января 2012

Как вы обнаружили, подзапросы не были разрешены в списке VALUES до SQL 2008. Однако существует простой способ:

INSERT INTO ITEM_TABLE 
SELECT TOP (1) 
    ISNULL(MAX(PK_COLUMN),0) + 1, 
    'Data 1', 
    @HeadSeq
FROM
    ITEM_TABLE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...