Execution-Plan
為什麼將 FOR XML 分配給 XML 變數會警告 CONVERT_IMPLICIT(XML)?
SET STATISTICS XML ON; DECLARE @x XML = (SELECT 'hi' "@id" FOR XML PATH ('this'), root ('xml'));
表達式中的類型轉換 (CONVERT_IMPLICIT(xml,
$$ Expr1001 $$,0)) 可能會影響查詢計劃選擇中的“CardinalityEstimate”
為什麼會發生轉換?我認為這
FOR XML
導致結果XML
已經是類型。如果這個警告可以/應該被忽略,我如何阻止警告出現在執行計劃中(這樣當我用類似的警告調試更大的查詢時,它不會分散我對實際問題的注意力)?
FOR XML PATH
表達式的返回類型是NVARCHAR(MAX)
,不是XML
。
XML_F52E2B61-18A1-11d1-B105-00805F49916B
我對 SSMS 將任何命名的列呈現為好像它具有XML
數據類型的事實感到困惑。如果我執行以下命令,我會在 SSMS 中獲得一個可點擊的 XML 結果單元格:SELECT 'hi' "@id" FOR XML PATH ('this'), root ('xml');
通過讓 SQL Server 吐出類型轉換錯誤,我能夠找出實際類型:
SELECT SQL_VARIANT_PROPERTY((SELECT 'hi' "@id" FOR XML PATH ('this'), root ('xml')), 'BaseType');
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);