Warum funktioniert so etwas nicht?
SELECT
CASE
WHEN NULLIF(COL_LENGTH('Customers', 'Somecol'), '') IS NULL THEN NULL
ELSE Somecol
END AS MyTest
FROM Customers;
Ich überprüfe nur, ob die Spalte vorhanden ist. SQL Server beklagt sich jedoch, dass sie Somecol
nicht vorhanden ist. Gibt es eine Alternative dazu in einer einzigen Aussage?
sql-server
t-sql
Carson Reinke
quelle
quelle
CASE
Anweisung eingeschlossen sind.INFORMATION_SCHEMA
könnte als Problemumgehung dienen.Antworten:
Die folgende Abfrage verwendet dieselbe Idee wie in dieser erstaunlichen Antwort von ypercube :
Das funktioniert so:
Wenn
dbo.Customers
eine Spalte benannt istSomeCol
, wirdSomeCol
in aufgelöstSomeCol AS MyTest
alsdbo.Customers.SomeCol
;Wenn die Tabelle keine solche Spalte enthält, ist der Verweis weiterhin gültig, da er jetzt wie folgt aufgelöst wird
dummy.SomeCol
: Aufdummy
Spalten kann in diesem Kontext verwiesen werden.Sie können auf diese Weise mehrere "Ersatz" -Spalten angeben. Der Trick besteht nicht darin, den Tabellenalias für solche Spalten zu verwenden (was in den meisten Situationen eine verpönte Praxis ist, aber in diesem Fall hilft Ihnen das Weglassen des Tabellenalias, das Problem zu lösen).
Wenn die Tabelle in einem Join verwendet wird und die andere Tabelle eine eigene hat
SomeCol
, müssen Sie die obige Abfrage wahrscheinlich als abgeleitete Tabelle verwenden, bevor Sie sie im Join verwenden, damit der Trick funktioniert.quelle
Eine Möglichkeit, dies zu tun, besteht darin, zu überprüfen, ob Spalten vorhanden sind, und dann das dynamische SQL basierend darauf zu erstellen, ob diese Spalte vorhanden ist oder nicht.
Ohne Dynamic SQL versucht SQL Server zu bewerten, ob die Spalte vorhanden ist oder nicht, bevor sie überhaupt die Anweisung ausführt, was zu einem Fehler führt.
Dies bedeutet jedoch, dass Sie zwei Abfragen schreiben müssen, die Sie möglicherweise in Zukunft ändern müssen. Aber ich glaube nicht, dass Sie
SELECT
Aussagen auf Spalten ausrichten sollten , die möglicherweise nicht vorhanden sind.quelle
Sie können XML verwenden, um Spalten abzufragen, die sich möglicherweise in der Tabelle befinden.
Erstellen Sie eine XML-Datei aus allen Spalten pro Zeile in einem Cross Apply und extrahieren Sie den Wert mithilfe der
values()
Funktion.Bei dieser Abfrage ist die ID bekannt, also holen Sie sie sich direkt aus der Tabelle. Col1 und Col2 können vorhanden sein oder nicht, um sie mithilfe von XML zu erhalten.
SQL-Geige
quelle
Mein Ansatz unterscheidet sich nur geringfügig von den anderen. Ich bevorzuge es, das System dafür zu verwenden und einfach eine Zählung zu erhalten, da Sie die Spaltenzählung einer Variablen am Anfang einer Abfrage zuweisen können und dann entscheiden, ob Sie fortfahren möchten oder nicht. Der Nachteil dabei ist… Wenn Sie denselben Spaltennamen in mehreren Tabellen haben, sind Sie sich nicht sicher, ob die Spalte in der Tabelle vorhanden ist, die Sie abfragen möchten. Die Technik funktioniert jedoch auch für bestimmte Tabellen, da Sie nur nach einer Zählung suchen.
Das "Problem" bei der konkreten Anfrage ist - das Problem, das Sie haben. Wenn Sie Probleme mit einem NULL-Wert haben, finden Sie im Allgemeinen eine andere Möglichkeit, die Existenz zu überprüfen. Dies ist eine Möglichkeit, ohne den Server aus dem Gleichgewicht zu bringen.
quelle
sysobjects
in Ihrer Abfrage verwenden, um zu prüfen, ob die bestimmte Tabelle eine solche Spalte enthält?SELECT 1 ...
Fehler auch nicht.EXISTS (SELECT ...)
aber meist schneller als(SELECT COUNT(*) ...)
, nicht umgekehrt.Wenn ich es richtig verstanden habe ...
Sie können die folgende Abfrage verwenden und entsprechend der Anzahl handeln ... Wenn die Anzahl> 1 ist, bedeutet dies, dass Sie die Spalte in dieser Tabelle und die Anzahl = 0 haben, dann haben Sie diese Spalte darin nicht Tabelle
SELECT count (*)
FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME IN ('Id')
UND TABLE_SCHEMA = 'dbo' und TABLE_NAME = 'UserBase';
quelle