为什么将 FOR XML 分配给 XML 变量会发出有关 CONVERT_IMPLICIT(XML) 的警告?

bin*_*nki 7 xml t-sql execution-plan type-conversion

SET STATISTICS XML ON;
DECLARE @x XML = (SELECT 'hi' "@id" FOR XML PATH ('this'), root ('xml'));
Run Code Online (Sandbox Code Playgroud)

表达式中的类型转换 (CONVERT_IMPLICIT(xml,[Expr1001],0)) 可能会影响查询计划选择中的“CardinalityEstimate”

为什么会发生转换?我认为这FOR XML导致结果XML已经是类型。如果这个警告可以/应该被忽略,我如何阻止警告出现在执行计划中(这样当我调试带有类似警告的更大查询时,它不会分散我对实际问题的注意力)?

bin*_*nki 5

FOR XML PATH表达式的返回类型是NVARCHAR(MAX),不是XML

我对 SSMS 呈现任何命名的列XML_F52E2B61-18A1-11d1-B105-00805F49916B就像它具有XML数据类型一样感到困惑。如果我运行以下命令,我会在 SSMS 中得到一个可点击的 XML 结果单元格:

SELECT 'hi' "@id" FOR XML PATH ('this'), root ('xml');
Run Code Online (Sandbox Code Playgroud)

通过让 SQL Server 吐出类型转换错误,我能够找出实际类型:

SELECT SQL_VARIANT_PROPERTY((SELECT 'hi' "@id" FOR XML PATH ('this'), root ('xml')), 'BaseType');
Run Code Online (Sandbox Code Playgroud)
Msg 206, Level 16, State 2, Line 1
Operand type clash: nvarchar(max) is incompatible with sql_variant
Run Code Online (Sandbox Code Playgroud)

要完全修复警告,只需在子句中添加TYPE指令FOR XML

SET STATISTICS XML ON;
DECLARE @x XML = (SELECT 'hi' "@id" FOR XML PATH ('this'), root ('xml'), TYPE);
Run Code Online (Sandbox Code Playgroud)