代码问题
显然这里没有嵌套
CASE
表达式。
不在查询文本中,不。但是解析器总是将CASE
表达式扩展为嵌套形式:
SELECT CASE SUBSTRING(p.Name, 1, 1)
WHEN 'a' THEN '1'
WHEN 'b' THEN '2'
WHEN 'c' THEN '3'
WHEN 'd' THEN '4'
WHEN 'e' THEN '5'
WHEN 'f' THEN '6'
WHEN 'g' THEN '7'
WHEN 'h' THEN '8'
WHEN 'i' THEN '9'
WHEN 'j' THEN '10'
WHEN 'k' THEN '11'
END
FROM AdventureWorks2012.Production.Product AS p
该查询是本地的(没有链接服务器)并且计算标量定义了以下表达式:
这在本地执行时很好,因为解析器看不到CASE
超过 10 级深度的嵌套语句(尽管它确实将一个语句传递给本地查询编译的后期阶段)。
但是,对于链接服务器,生成的文本可能会发送到远程服务器进行编译。如果是这种情况,远程解析器CASE
会看到超过 10 层深的嵌套语句,并且您会收到错误 8180。
另一个怪事。此内联表值函数产生相同的错误
内联函数被就地扩展到原始查询文本中,因此链接服务器出现相同的错误结果也就不足为奇了。
但是类似的多语句 TVF 工作正常
相似,但不相同。msTVF 涉及到 的隐式转换varchar(max)
,这恰好可以防止将CASE
表达式发送到远程服务器。因为CASE
是在本地计算的,所以解析器永远不会看到过度嵌套CASE
并且没有错误。如果您将表定义从 更改为结果varchar(max)
的隐式类型CASE
- varchar(2)
- 表达式被 msTVF 远程控制,您将收到错误消息。
CASE
最终,错误发生在远程服务器评估过度嵌套时。如果CASE
未在远程查询迭代器中求值,则不会产生错误结果。例如,以下包含一个CONVERT
非远程的,因此即使使用链接服务器也不会发生错误:
SELECT CASE CONVERT(varchar(max), SUBSTRING(p.Name, 1, 1))
WHEN 'a' THEN '1'
WHEN 'b' THEN '2'
WHEN 'c' THEN '3'
WHEN 'd' THEN '4'
WHEN 'e' THEN '5'
WHEN 'f' THEN '6'
WHEN 'g' THEN '7'
WHEN 'h' THEN '8'
WHEN 'i' THEN '9'
WHEN 'j' THEN '10'
WHEN 'k' THEN '11'
END
FROM SQL2K8R2.AdventureWorks.Production.Product AS p
问题答案
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:starryrocklee#gmail.com (将#修改为@)
如果觉得前端之家所整理的内容很不错的话,欢迎点击下方分享按钮,转发给身边开发程序员好友。