У меня есть (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 записями, все вставленные идентификаторы возвращаются без разумного порядка, почему это происходит?
Мне не нужна другая временная таблица, чтобы поместить ее туда, отсортировать и вернуть, я просто хочу знать, почему это происходит, и есть ли какое-либо решение без использования дополнительной временной таблицы для сортировки?
3 ответа
Взгляните на эту статью: http://technet.microsoft.com/en-us/library/ms177564.aspx
В нем говорится: «Нет гарантии, что порядок, в котором изменения применяются к таблице, и порядок, в котором строки вставляются в выходную таблицу или табличную переменную, будут соответствовать».
Я предлагаю использовать выбор после вставки, чтобы получить идентификаторы.
Если вы хотите что-то заказать, вам нужно будет использовать предложение ORDER BY. Нет смысла пытаться полагаться на физический порядок (даже если вы думаете, что знаете, что он существует (например, из-за кластерного индекса)
Чтобы заполнить столбец числовой последовательностью, используйте ROW_NUMBER () (или последовательность в SQL Server 2012). Не пытайтесь полагаться на столбец ИДЕНТИЧНОСТЬ, потому что его поведение не всегда можно контролировать.
Похожие вопросы
Новые вопросы
sql
Язык структурированных запросов (SQL) - это язык запросов к базам данных. Вопросы должны включать примеры кода, структуру таблицы, примеры данных и тег для используемой реализации СУБД (например, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 и т. Д.). Если ваш вопрос относится исключительно к конкретной СУБД (использует определенные расширения / функции), используйте вместо этого тег этой СУБД. Ответы на вопросы, помеченные SQL, должны использовать стандарт ISO / IEC SQL.