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
已经是类型。如果这个警告可以/应该被忽略,我如何阻止警告出现在执行计划中(这样当我调试带有类似警告的更大查询时,它不会分散我对实际问题的注意力)?
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)
Run Code Online (Sandbox Code Playgroud)Msg 206, Level 16, State 2, Line 1 Operand type clash: nvarchar(max) is incompatible with sql_variant
要完全修复警告,只需在子句中添加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)