У меня есть (tableA) с одним полем идентификатора (ID), мне нужно вставить сразу несколько строк с помощью одной операции вставки, поэтому я использую структуру таблицы в качестве параметра передачи для моей хранимой процедуры

Мне нужен вставленный идентификатор с порядком вставки, поэтому я запускаю следующий запрос в моем SP (tableB имеет ту же структуру, что и tableA):

CREATE PROCEDURE ssp_Test
(
    tableA tableAType
)
AS
BEGIN

INSERT INTO tableB(field1, field2, ...)
OUTPUT INSERTED.ID
SELECT field1, field2, ... from tableA

END

Если я запустил вышеуказанную процедуру со 100 записями, она вернет новое поле идентификатора с порядком, в котором оно было вставлено в tableB, но когда я запускаю его с 500 записями, все вставленные идентификаторы возвращаются без разумного порядка, почему это происходит?

Мне не нужна другая временная таблица, чтобы поместить ее туда, отсортировать и вернуть, я просто хочу знать, почему это происходит, и есть ли какое-либо решение без использования дополнительной временной таблицы для сортировки?

1
Ehsan 5 Мар 2011 в 14:13

3 ответа

Лучший ответ

Взгляните на эту статью: http://technet.microsoft.com/en-us/library/ms177564.aspx

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

Я предлагаю использовать выбор после вставки, чтобы получить идентификаторы.

1
Bravax 5 Мар 2011 в 14:49
Это относится только к результату OUTPUT или фактическая операция вставки не является надежной, если первая запись вставлена ​​первой.
 – 
Ehsan
6 Мар 2011 в 08:14
Результат OUTPUT, вставка должна выполняться в порядке выбора. (Попробуйте добавить заказ по вашему выбору).
 – 
Bravax
6 Мар 2011 в 13:34

Если вы хотите что-то заказать, вам нужно будет использовать предложение ORDER BY. Нет смысла пытаться полагаться на физический порядок (даже если вы думаете, что знаете, что он существует (например, из-за кластерного индекса)

3
Ralph Shillington 5 Мар 2011 в 14:26

Чтобы заполнить столбец числовой последовательностью, используйте ROW_NUMBER () (или последовательность в SQL Server 2012). Не пытайтесь полагаться на столбец ИДЕНТИЧНОСТЬ, потому что его поведение не всегда можно контролировать.

0
EBarr 16 Окт 2012 в 19:05