Warum warnt das Zuweisen von FOR XML zu einer XML-Variablen vor CONVERT_IMPLICIT (XML)?

7
SET STATISTICS XML ON;
DECLARE @x XML = (SELECT 'hi' "@id" FOR XML PATH ('this'), root ('xml'));

Die Typkonvertierung im Ausdruck (CONVERT_IMPLICIT (xml, [Expr1001], 0)) kann sich auf "CardinalityEstimate" bei der Auswahl des Abfrageplans auswirken

Warum findet eine Konvertierung statt? Ich dachte, FOR XMLdas Ergebnis sei bereits der XMLTyp. Wenn diese Warnung ignoriert werden kann / sollte, wie kann ich verhindern, dass die Warnung im Ausführungsplan angezeigt wird (damit ich beim Debuggen einer größeren Abfrage mit einer ähnlichen Warnung nicht von tatsächlichen Problemen abgelenkt werde)?

Binki
quelle

Antworten:

5

Der Rückgabetyp des FOR XML PATHAusdrucks ist NVARCHAR(MAX)nicht XML.

Ich war verwirrt darüber, dass SSMS jede Spalte mit dem Namen XML_F52E2B61-18A1-11d1-B105-00805F49916Bso rendert, als hätte sie den XMLDatentyp. Wenn ich den folgenden Befehl ausführe, wird in SSMS eine anklickbare XML-Ergebniszelle angezeigt:

SELECT 'hi' "@id" FOR XML PATH ('this'), root ('xml');

Ich konnte den tatsächlichen Typ herausfinden, indem ich SQL Server veranlasste, einen Typkonvertierungsfehler auszuspucken:

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

Um die Warnung vollständig zu beheben, fügen SieTYPE einfach die Anweisung zur FOR XMLKlausel hinzu:

SET STATISTICS XML ON;
DECLARE @x XML = (SELECT 'hi' "@id" FOR XML PATH ('this'), root ('xml'), TYPE);
Binki
quelle