Какой идентификатор значения по умолчанию для переменной в T- SQL? - PullRequest
1 голос
/ 23 января 2020

В приведенном ниже коде, если я запусту его с некомментированным «SET @LossScenarioID = NULL», он сломается, но с прокомментированным «SET @LossScenarioID = NULL» он будет работать бесконечно l oop. Каково значение переменной, когда мы ее определили, и сбрасывает ли она значение переменной, когда мы снова ее определяем, как мы делаем это здесь снова в al oop? Каково значение переменной по умолчанию в SQL?

DECLARE @LossScenario AS TABLE
        (
              LossScenarioId INT
            , IsProcessed BIT
        )

    INSERT INTO @LossScenario
        (
              LossScenarioId
            , IsProcessed
        )
    Values ( 220, 0)
        , (221, 0)

    WHILE 1=1
    BEGIN
        DECLARE @LossScenarioID INT

        --SET @LossScenarioID = NULL
        SELECT TOP 1 @LossScenarioID =  LossScenarioId
        FROM @LossScenario
        WHERE IsProcessed = 0


        IF @LossScenarioID IS NULL
        BEGIN
            BREAK
        END

        UPDATE @LossScenario
        SET IsProcessed = 1 
        WHERE LossScenarioId = @LossScenarioID
    END

1 Ответ

3 голосов
/ 23 января 2020

Во второй раз вокруг l oop переменная @LossScenarioID НЕ автоматически повторно инициализируется в NULL. И, если запрос TOP 1 не находит совпадающих результатов, это НЕ повторно инициализирует переменную в NULL. Присвоение переменной не происходит - она ​​сохранит предыдущий идентификатор, который у нее был, и, следовательно, почему она будет постоянно l oop.

Это ожидается, хотя я уже видел эту поездку раньше! Поэтому вам определенно следует вручную повторно инициализировать переменную в NULL в начале каждой итерации.

В более широком смысле, операций RBAR (Row-By-Agonizing-Row) обычно следует по возможности избегать, в пользу основанных на множестве подходов. Вы обнаружите, что лучше получите лучшую производительность, более масштабируемое решение и избежите определенных ловушек, подобных этой.

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