为什么链接服务器在 CASE 表达式中有 10 个分支的限制?

2023-02-09
前端之家小编收集整理的为什么链接服务器在 CASE 表达式中有 10 个分支的限制?内容,希望整理的这个开发编程问题为什么链接服务器在 CASE 表达式中有 10 个分支的限制?能够快速解决!

代码问题

显然这里没有嵌套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 个分支的限制?

这在本地执行时很好,因为解析器看不到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

为什么链接服务器在 CASE 表达式中有 10 个分支的限制?

问题答案

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:starryrocklee#gmail.com (将#修改为@)

如果觉得前端之家所整理的内容很不错的话,欢迎点击下方分享按钮,转发给身边开发程序员好友。

编程问答


CREATE FILE 遇到操作系统错误 5(访问被拒绝。)
如何在一个查询中删除具有公共前缀的多个表?
多语句 TVF 与内联 TVF 性能
由于可能丢失数据,无法转换该值
SQL Server 数据库不收缩