SQL Server 2008 - PullRequest
       4

SQL Server 2008

0 голосов
/ 09 декабря 2010

У меня есть такая таблица

ID          NAME
----------- -----------
1           JON
2           JIM
3           BOB

(3 row(s) affected)

Какой мне нужен код, чтобы выбрать число, которое не выходит из идентификатора столбца, и вывести его в файл, чтобы в этом случае это было "4" .

Что мне нужно сделать, это начать с 1, затем проверить 2,3 и так далее, пока if не найдет число, которого нет в таблице.

Этот код должен быть в SQL Server 2008

Ответы [ 2 ]

5 голосов
/ 09 декабря 2010

Вам нужна таблица или список чисел:

Declare @MaxValue int;
Set @MaxValue = 100;

With Numbers As
    (
    Select 1 As Value
    Union All
    Select Value + 1
    From Numbers
    Where Value <= @MaxValue
    )
Select Min(N.Value)
From Numbers As N
    Left Join MyTable As T
        On T.Id = N.Value
Where T.Id Is Null
OPTION (MAXRECURSION 0)
1 голос
/ 09 декабря 2010

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

Однако, если все, что вам нужно, это следующий номер в последовательности, то это должно работать:

SELECT MAX(ID) + 1 FROM Table

Редактировать: Я только что заметил из ответа Томаса (и повторной проверки вопроса), что похоже, что вы ищете первый пробел, который может быть или не быть следующим числом. Но я думаю, что общий смысл все еще остается ... почему?

Редактировать: Я рад, что вы приняли ответ, но я все еще думаю, что это еще не все. Например, если вы хотите просто «зарезервировать» идентификатор, есть несколько способов сделать это.

GUID хороши для идентификаторов, сгенерированных приложением, но не должны использоваться в качестве первичных ключей из соображений производительности. Вы можете иметь второй столбец в качестве GUID и использовать его в своем приложении, позволяя простой столбец с автоинкрементом быть первичным ключом. Есть и другие соображения относительно производительности, и вам следует изучить их.

И наоборот, существует алгоритм под названием Hi / Lo для резервирования диапазонов идентификаторов базы данных. Он использует целые числа, которые отлично подходят для индексации и делают отличные первичные ключи. Он оставляет пропуски в последовательности, но в любом случае этого следует ожидать даже с обычным автоматически генерируемым столбцом (например, при удалении записи).

Если существует требование, чтобы в идентификаторах не было пробелов, это звучит как странное требование бизнеса и должно быть проанализировано на предмет его истинных потребностей. Нечто подобное не должно перетекать в первичный ключ вашей персистентности данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...