Ich schreibe Code, um einige DMVs abzufragen. Einige der Spalten können je nach SQL-Version in der DMV vorhanden sein oder nicht. Ich habe online einen interessanten Vorschlag gefunden, wie man bestimmte Überprüfungen mit überspringt CROSS APPLY
.
Die folgende Abfrage ist ein Beispiel für Code zum Lesen einer DMV für eine möglicherweise fehlende Spalte. Der Code erstellt einen Standardwert für die Spalte und CROSS APPLY
extrahiert die tatsächliche Spalte, falls vorhanden, aus der DMV.
Die Spalte, die der Code zu extrahieren versucht, BogusColumn, existiert nicht. Ich würde erwarten, dass die folgende Abfrage einen Fehler über einen ungültigen Spaltennamen generiert ... aber dies ist nicht der Fall. Es gibt fehlerfrei NULL zurück.
Warum führt die unten stehende CROSS APPLY-Klausel NICHT zu einem Fehler "Ungültiger Spaltenname"?
declare @x int
select @x = b.BogusColumn
from
(
select cast(null as int) as BogusColumn
) a
cross apply
(
select BogusColumn from sys.dm_exec_sessions
) b;
select @x;
Wenn ich die Abfrage CROSS APPLY
separat ausführe :
select BogusColumn from sys.dm_exec_sessions;
Ich erhalte einen erwarteten Fehler bezüglich eines ungültigen Spaltennamens:
Msg 207, Level 16, State 1, Line 9
Invalid column name 'BogusColumn'.
Wenn ich den DMV-Spaltennamen in BogusColumn2 ändere, um ihn eindeutig zu machen, wird der erwartete Spaltennamenfehler angezeigt:
select a.BogusColumn1, b.BogusColumn2
from
(
select cast(null as int) as BogusColumn1
) a
cross apply
(
select BogusColumn2 from sys.dm_exec_sessions
) b
Ich habe dieses Verhalten in Versionen von SQL 2012 bis SQL 2017 getestet und das Verhalten ist in allen Versionen konsistent.
quelle
IF @MajorVersion >= @SQL2016 AND @MinorVersion >= @SQL2016SP1 BEGIN /* write and execute dynamic SQL, etc. */ END
Antworten:
BogusColumn wird in der 1. Abfrage als gültige Spalte definiert.
Wenn wir cross apply anwenden, wird die Spaltenauflösung wie folgt verwendet:
1. In der 2. Abfrage (dmv) wird nach der Spalte 'BogusColumn' gesucht.
2. Wenn die Spalte in der dmv vorhanden ist, wird sie in die dmv
3 aufgelöst Wenn die Spalte in der dmv nicht vorhanden ist, sucht sie in der äußeren Abfrage (der obersten) nach dieser Spalte und verwendet den dort angegebenen Wert.
Mit anderen Worten, wenn in der Ansicht keine falsche Spalte definiert ist, funktioniert die endgültige Abfrage wie folgt:
Wenn es definiert ist, wird die Abfrage wie folgt aufgelöst:
quelle