Eu estava escrevendo um INSTEAD OF INSERT
gatilho e bati um erro neste código:
CASE
WHEN Inserted.KeyId IS NOT NULL THEN Inserted.KeyId
ELSE NEXT VALUE FOR SomeSchema.NextKeyId
END
O erro foi:
A função NEXT VALUE FOR não pode ser usada dentro de CASE, CHOOSE, COALESCE, IIF, ISNULL e NULLIF.
A leitura mostra que essa é uma limitação bastante difícil, que acho que posso aceitar, mas gostaria de saber por que essa limitação existe.
Parece estranho para mim que ele não possa simplesmente chamar esse método para a parte do conjunto que corresponde a essa ramificação da instrução case.
Alguém pode explicar por que uma CASE
declaração não permite NEXT VALUE FOR
?
Para responder completamente à sua pergunta, é preciso conhecer detalhes íntimos da implementação do mecanismo SQL Server SQL, e a maioria (todas?) das pessoas que têm esse conhecimento provavelmente assinaram todos os tipos de NDAs e acordos de confidencialidade. O que se segue é minha especulação.
Normalmente, o escopo de
NEXT VALUE
é toda a instrução SQL em que ela é referenciada. Isso provavelmente significa que o valor da sequência é gerado e disponibilizado independentemente de outros recursos dessa instrução SQL. Isso tem um conflito semântico com o uso condicional deNEXT VALUE
nas situações descritas pela mensagem de erro. Em outras palavras, o usuário não sabe se o próximo valor da sequência foi ou não consumido, dependendo de alguma condição não determinística, mas ao mesmo tempo já foi gerado de forma independente.Então, meu palpite é que a restrição visa evitar essa ambiguidade semântica. O que você pode fazer é (em pseudocódigo)
que não tem essa ambiguidade - é explicitamente dito que um valor de sequência é consumido toda vez, embora possa ou não ser realmente usado.