执行含XML列查询的sp_send_dbmail时报sqlcmd库初始化错误-2147467259
报错原因分析
该报错的核心诱因是sp_send_dbmail执行@query参数指定的SQL逻辑时,默认使用msdb数据库作为执行上下文,其内部调用的sqlcmd引擎对跨库引用的XML列的XQuery方法(nodes()/value()等)存在解析限制:
- 单独运行两段查询时,使用的是业务数据库
[DB]的上下文,XML列的方法调用可以正常解析,因此两段语句都能正常执行 - 不带XML方法的简化查询调用
sp_send_dbmail时可以正常返回结果,是因为你使用了[DB].[Schema].[Configuration]全限定名,普通跨库查询可以被sqlcmd正常解析 - 带
outer apply+ XMLnodes()方法的查询触发报错,是因为sqlcmd引擎在msdb的默认上下文下,无法正确解析跨库XML列的XQuery方法调用,最终抛出初始化失败的错误,和列名与表名重名没有关联。
解决方案
你只需要在调用msdb.dbo.sp_send_dbmail时,额外添加@query_database参数,显式指定查询运行的数据库为你的业务库即可,示例修改如下:
declare @SQL varchar(8000) set @SQL = 'select a.b.value(''(../../@ID)'',''varchar(100)'') as [System-ID] from [Schema].[Configuration] R outer apply R.[Configuration].nodes(''root/System/Role/Authorization'') as a(b) where R.[Report ID] = ''IT.00004''' print @SQL exec msdb.dbo.sp_send_dbmail @profile_name = 'servername', @recipients = 'info@company.com', @subject = 'Test B', @query = @SQL, @query_database = 'DB' -- 新增此行,指定执行业务查询的数据库
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

