SQL сохранен proc - помогите мне написать этот, пожалуйста! - PullRequest
0 голосов
/ 30 июня 2010

Не могли бы вы помочь мне с этим:

В одном из моих сценариев я вставляю некоторые данные в некоторую таблицу "Item". Одним из столбцов в таблице «Item» является «ItemNumber».

Я хочу иметь возможность вызывать какую-то функцию (скорее всего, сохраненный процесс), где она выдаст мне числовое число, которое я могу использовать для ItemNumber.

Я НЕ МОГУ использовать AutoIncrement, потому что ItemNumber уникален и может возникнуть коллизия, когда в другой скрипт я вставляю данные в «Item», , который уже имеет «ItemNumber»

Мне известен только номер Max для «ItemNumber», и я могу свободно использовать что-либо после этого.

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

Я думал о создании таблицы с одним столбцом с MaxNumber в нем и сохраненного процесса, где он вернет мне MaxNumber , а также увеличит MaxNumber на 1 для следующего использования

Мне нужна помощь в написании сохраненного процесса и его использовании с вызовом INSERT INTO Item.

EDIT:

В основном я беру данные из 5 старых таблиц, где ItemNumber либо NULL, либо установлен. Для тех, которые установлены, все они являются уникальными числами. Для данных, где ItemNumber равен NULL, я хочу назначить его, какой наилучший подход?

Помогите пожалуйста!

Спасибо

Voodoo

1 Ответ

2 голосов
/ 30 июня 2010

(Предполагается, что SQL Server - возможно, применяется к большинству реализаций SQL)

Если вы используете ограничение IDENTITY для своего поля, сервер не допустит дублирования экземпляров.Как отмечается в одном из комментариев, в этом случае значение рассчитывается на сервере, и ваше приложение не предоставляет (и в обычных условиях не может) его предоставить.

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

Если вам нужны непрерывные идентификационные номера,для обновления таблицы вам понадобится доступ с сериализацией, которым вы должны будете управлять и который не будет эффективным.(Вы по-прежнему можете объявить его столбцом IDENTITY, но для таблицы для каждого обновления необходимо установить IDENTITY_INSERT On).

Дополнительно:

Возможно, это немного клудж, но можетработать по разовому сценарию.Рассматривали ли вы копирование данных в новую таблицу, где установлен идентификатор, затем применение ограничения IDENTITY и вставку данных с пустыми идентификаторами (что позволяет серверу выделить их для вас?). Это может решить вашу конкретную проблему здесь.

...