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.
IF @MajorVersion >= @SQL2016 AND @MinorVersion >= @SQL2016SP1 BEGIN /* write and execute dynamic SQL, etc. */ END