Execution-Plan

為什麼將 FOR XML 分配給 XML 變數會警告 CONVERT_IMPLICIT(XML)?

  • September 11, 2015
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);

引用自:https://dba.stackexchange.com/questions/114511