Генерация идентификаторов автоинкремента в SQL Server 2005 без ORDER BY
Необходимость вставлять данные из одной таблицы в другую при автоинкременте столбец, не являющийся идентификационным, может стать проблемой. Стандартный подход предполагает использование курсора или создание табличной переменной, но это может быть неэффективно.
При отсутствии допустимого поля ORDER BY можно использовать функцию ROW_NUMBER. Однако отсутствие явного порядка не гарантирует сохранение исходного порядка данных. Это связано с тем, что «не упорядочено» отличается от «сохранения исходного порядка».
Чтобы решить эту проблему, решение предполагает отказ от явного упорядочения следующим образом:
INSERT dbo.TargetTable (ID, FIELD) SELECT Row_Number() OVER (ORDER BY (SELECT 1)) Coalesce( (SELECT Max(ID) FROM dbo.TargetTable WITH (TABLOCKX, HOLDLOCK)), 0 ), FieldValue FROM dbo.SourceTable WHERE {somecondition};
Этот подход вычисляет максимальный идентификатор и вставляет данные при получении блокировок, чтобы избежать ошибок параллелизма.
Однако обратите внимание, что использование столбца идентификаторов настоятельно рекомендуется, поскольку это устраняет необходимость для блокировки и обеспечивает оптимальный параллелизм. Столбцы идентификаторов обеспечивают более эффективное и надежное решение для автоматического увеличения идентификаторов в SQL Server.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3