Безопасно ли использовать Select Top и Delete Top последовательно? - PullRequest
0 голосов
/ 07 апреля 2010

Я часто пишу циклы T-SQL, которые выглядят так в сценариях обновления:

While Exists (Select * From #MyTable)
    Begin
    Declare @ID int, @Word nvarchar(max)
    Select Top 1 @ID=ID, @Word=[Word] From #MyTable
    -- Do something --
    Delete #MyTable Where ID=@ID
    End

Работает, но я заметил новую функцию Delete Top, которая была бы полезна, когда #MyTable это просто список строк В этом случае, будет ли это работать:

While Exists (Select * From #MyTable)
    Begin
    Declare @Word nvarchar(max)
    Select Top 1 @Word=[Word] From #MyTable
    -- Do something --
    Delete Top(1) #MyTable
    End

Ну да, это работает в моем тестовом скрипте, но безопасно ли это? Выберет Top 1 и Delete Top (1) всегда ссылаются на одну и ту же запись, или Top немного более расплывчат.

Спасибо, Роб.

Ответы [ 2 ]

3 голосов
/ 07 апреля 2010

Нет, ваш второй пример небезопасен.

Если вы собираетесь использовать «SELECT TOP ...» (и вам небезразличен порядок, в котором выбираются строки), вам действительно следует использовать «ORDER BY», чтобы явно указать порядок. Вы МОЖЕТЕ получить требуемый порядок без «ORDER BY», но SQL Server не дает никаких гарантий относительно порядка возвращаемых строк, если ORDER BY не используется.

В случае «DELETE TOP ..» вы не можете добавить «ORDER BY», поэтому вы должны использовать предложение WHERE, которое однозначно идентифицирует строки, которые будут удалены, как вы сделали в первый пример.

2 голосов
/ 07 апреля 2010

Если вы часто пишете циклы, либо вы делаете что-то не так, либо ваша база данных нуждается в редизайне, либо вы вставляете большие партии данных, которые должны выполняться партиями по 1000 записей или около того. Бьюсь об заклад, почти все, что вы делаете, может быть сделано на основе набора и значительно повысить производительность. Я не могу показать вам, как, не зная, что происходит, если что-то делать, но, скорее всего, это можно сделать на основе набора с помощью начального регистра.

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