Die Warnung ist aufgrund der XML-Funktion vorhanden value()
. Der zweite Parameter value()
ist, in den der in XML gespeicherte Wert konvertiert werden soll. Sie könnten argumentieren, dass dies tatsächlich keine implizite Konvertierung ist, sondern eine sehr explizite Konvertierung, da Sie darum bitten, dass dies geschieht. Vielleicht etwas, das ein Verbindungselement Microsoft vorschlagen kann.
Einfachste Möglichkeit, das zu reproduzieren, was Sie sehen.
declare @X xml;
select @X.value('text()[1]', 'int');
Gibt diese beiden Warnungen.
<Warnings>
<PlanAffectingConvert ConvertIssue="Cardinality Estimate" Expression="CONVERT_IMPLICIT(int,XML Reader with XPath filter.[lvalue],0)" />
<PlanAffectingConvert ConvertIssue="Cardinality Estimate" Expression="CONVERT_IMPLICIT(int,XML Reader with XPath filter.[value],0)" />
</Warnings>
Wie Sie sehen können, erhalten Sie es auch mit int's und Sie erhalten zwei davon für jeden Aufruf von value()
.
declare @X xml;
select @X.value('text()[1]', 'int'),
@X.value('text()[1]', 'bit');
<Warnings>
<PlanAffectingConvert ConvertIssue="Cardinality Estimate" Expression="CONVERT_IMPLICIT(int,XML Reader with XPath filter.[lvalue],0)" />
<PlanAffectingConvert ConvertIssue="Cardinality Estimate" Expression="CONVERT_IMPLICIT(int,XML Reader with XPath filter.[value],0)" />
<PlanAffectingConvert ConvertIssue="Cardinality Estimate" Expression="CONVERT_IMPLICIT(bit,XML Reader with XPath filter.[lvalue],0)" />
<PlanAffectingConvert ConvertIssue="Cardinality Estimate" Expression="CONVERT_IMPLICIT(bit,XML Reader with XPath filter.[value],0)" />
</Warnings>
Die Konvertierung erfolgt im Stream Aggregate-Operator, der den Wert wie folgt berechnet.
MIN(CASE WHEN [@X] IS NULL
THEN NULL
ELSE
CASE WHEN datalength(XML Reader with XPath filter.[value])>=(128)
THEN CONVERT_IMPLICIT(int,XML Reader with XPath filter.[lvalue],0)
ELSE CONVERT_IMPLICIT(int,XML Reader with XPath filter.[value],0)
END
END)
Das Ergebnis der Funktion "Tabellenwert" wird in der Spalte lvalue
oder zurückgegeben value
. Der Ausdruck prüft, indem er verwendet, datalength
um herauszufinden, woher er abgerufen werden soll, und konvertiert ihn dann in den gewünschten Datentyp.
Gibt es eine Möglichkeit, diese Warnung zu entfernen?
Ja da ist. Sie entfernen die TYPE
Direktive aus der FOR XML PATH
Anweisung und entfernen den Aufruf der value()
Funktion. Ein Nebeneffekt dabei ist, dass von Ihnen verkettete Werte, die Zeichen enthalten, die wie in XML &<>
codiert werden müssen, in Ihrem Ergebnis codiert werden.