SQL 2017兼容级别120下STRING_SPLIT单独查询可用存储过程报错咨询
问题根本原因
- STRING_SPLIT 是SQL Server 2016首次引入的内置表值函数,要求数据库兼容级别至少为130(对应SQL Server 2016版本),你使用的兼容级别120(对应SQL Server 2014版本)默认不支持该函数。
- 单条查询可以正常运行的核心原因是系统函数的可用性由执行查询的会话当前连接的数据库兼容级别决定,和你查询的表所属数据库无关:你执行单条查询时,会话实际连接的是兼容级别≥130的数据库,只是通过全限定名访问了兼容级别120的数据库中的表,所以可以正常调用STRING_SPLIT。
- 存储过程执行时,函数可用性完全绑定到存储过程所属数据库的兼容级别,不受执行会话的上下文影响,因此兼容级别120的库中的存储过程调用STRING_SPLIT就会报对象不存在的错误。
解决方案
你可以根据实际场景选择任意一种方案:
方案1:升级数据库兼容级别(最推荐)
调整目标数据库的兼容级别到130或更高,即可从根本上解决问题,调整前请做好业务兼容性测试,调整语句如下:
ALTER DATABASE <你的数据库名称> SET COMPATIBILITY_LEVEL = 140; -- 140为SQL Server 2017原生兼容级别调整完成后重新编译对应存储过程即可生效:
EXEC sp_recompile '<你的存储过程名称>';方案2:添加查询提示强制启用函数
如果暂时无法升级数据库兼容级别,可以在存储过程的查询语句末尾添加查询提示,通过跟踪标志460强制在低兼容级别下识别STRING_SPLIT:
select email, value from <database.schema.table> cross apply STRING_SPLIT(<column>,';') where trim(value) not in ('string1','string2') OPTION (QUERYTRACEON 460);方案3:替换为自定义字符串拆分函数
如果以上两种方案都不满足要求,可以自行实现一个适配低兼容级别的自定义字符串拆分表值函数,替换代码中的STRING_SPLIT即可,无需修改核心业务逻辑。
内容的提问来源于stack exchange,提问作者Aayush Poonia
相关产品推荐
相关产品推荐

