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)?

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);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.