我正在编写INSTEAD OF INSERT
触发器并在此代码上遇到错误:
CASE
WHEN Inserted.KeyId IS NOT NULL THEN Inserted.KeyId
ELSE NEXT VALUE FOR SomeSchema.NextKeyId
END
错误是:
NEXT VALUE FOR 函数不能在 CASE、CHOOSE、COALESCE、IIF、ISNULL 和 NULLIF 中使用。
阅读表明这是一个相当硬的限制,我想我可以接受,但我想知道为什么会有这个限制。
对我来说似乎很奇怪,它不能只为与 case 语句的该分支匹配的集合部分调用该方法。
有人可以解释为什么CASE
声明不允许NEXT VALUE FOR
吗?
要完全回答您的问题,您需要了解 SQL Server SQL 引擎实现的详细信息,并且大多数(全部?)拥有这些知识的人可能已经签署了各种 NDA 和保密协议。以下是我的推测。
通常,范围
NEXT VALUE
是引用它的整个 SQL 语句。这可能意味着序列值的生成和可用独立于该 SQL 语句的其他功能。NEXT VALUE
这与错误消息描述的情况下的条件使用存在语义冲突。换句话说,用户不知道下一个序列值是否已经被消费,这取决于一些不确定的条件,但同时它已经独立生成了。所以我的猜测是,该限制旨在防止这种语义歧义。你可以做的是(在伪代码中)
它没有那种歧义 - 明确地说每次都会消耗一个序列值,尽管它可能会或可能不会实际使用。