Hi,
ich versuche zu prüfen ob in meiner Tabelle eine Spalte existiert um sie dann auszulesen, falls dies der Fall ist. Ich habe dazu folgendes T-SQL Script geschrieben:
if exists (select column_name from information_schema.columns where table_name='TABELLENNAME' and column_name='GG')
begin
select GG from TABELLENNAME where fs='B' and mode='ERW'
end
Dennoch erhalte ich die Fehlermeldung bei select dass die Spalte 'GG' ungültig sei. Dafür prüfe ich ja aber vorher ab, um diesen Fehler zu vermeiden. Wieso funktioniert das so nicht?
Hier mal ein Beispiel für Nothwind.
IF EXISTS ( SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Customers' AND COLUMN_NAME = 'CustomerID' )
SELECT CustomerID FROM Customers;
ELSE
SELECT 'Spalte nicht vorhanden'
Danke dir - habe es nun so versucht, doch ich erhalte immernoch die Meldung, die Spalte wäre ungültig:
if exists (select column_name from information_schema.columns where table_name='TABELLE' and column_name='GG')
select GG from TABELLE where fs='B' and mode='ERW';
else
select 'nicht gefunden!'
Dieses Script führe ich im Microsoft SQL Server Management Studio aus. Wo liegt mein Fehler?
Hallo Dr.Cool,
heißt Deine Tabelle denn wirklich "TABELLE"? Ansonsten fällt mir an der Syntax nichts auf.
Gruß,
Fabian
"Eine wirklich gute Idee erkennt man daran, dass ihre Verwirklichung von vornherein ausgeschlossen erscheint." (Albert Einstein)
Gefangen im magischen Viereck zwischen studieren, schreiben, lehren und Ideen umsetzen…
Blog: www.fabiandeitelhoff.de
Hallo Fabian,
nein, ich habe den Namen nur verändert weil der ziemlich lang ist (~30 Zeichen). Aber der Tabellenname ist absolut korrekt.
Liegt es vielleicht am SQL Server Management Studio? Wenn das Statement verarbeitet wird, berücksichtigt er da wirklich die IFs oder prüft er einfach überall ob die jeweilige Spalte existiert? Weil dann wäre die Fehlerquelle klar.
So hab es nun nochmal im Programm selbst ausprobiert und es kommt immernoch die Fehlermeldung "Ungültige Spalte".
Das gibt es doch nicht. Ich will lediglich prüfen ob eine Spalte existiert und wenn ja will ich sie auslesen. Hat niemand einen Vorschlag?
Die Abfrage funktioniert so. Vielleicht bist Du nicht auf der richtigen Datenbank wenn Du die Abfrage stellst?? Im Management Studio siehst du die verbudene Datenbank für die aktuelle Query links neben dem "Execute"-Knopf in der Symbolleiste.
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
Datenbank stimmt - Tabelle stimmt.
Funktioniert jedoch nicht. Und ich habe die Abfrage genau wie oben beschrieben.
Kann es daran liegen, dass ich die Express Edition des SQL Servers 2005 habe?
Nein- ich benutze auch die Express-Edition und bei mir hat die Abfrage genau so funktioniert, wie von Noodles beschrieben (mit einer meiner Tabellen). Muss noch irgendwo ein typo oder sowas sein...
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
Ok ich finde das merkwürdig!
Ich habe eine Tabelle 'mitarbeiter' und eine Spalte 'mtyp'. Um der Sache auf den Grund zu gehen lese ich mit Absicht jedoch aus 'mtypp' aus, was es als Spalte natürlich nicht gibt.
if exists(select column_name from information_schema.columns where table_name='mitarbeiter' and column_name='mtypp')
select 'geht'
else
select 'sorry, rockt nich...'
Hier stimmt es!. Es wird 'sorry, rockt nich' ausgegeben, da die Spalte nicht existiert. Jetzt kommt aber der Hammer:
if exists(select column_name from information_schema.columns where table_name='mitarbeiter' and column_name='mtypp')
select mtypp from mitarbeiter
else
select 'sorry, rockt nich...'
Nun stimmt es nicht mehr!. Ich habe an der Abfrage nichts verändert - ich habe, bei positiver Rückmeldung, dass die Spalte existiert lediglich eine Abfrage auf die Spalte gemacht mittels select. Und was zeigt er mir an? 'Ungültige Spalte mtypp'. Aber eigentlich müsste er zu 100% wieder beim else-block landen. Nämlich bei 'sorry, rockt nich...'.
*akte-x melodie pfeif*
Ja stimmt das kann ich auch reproduzieren.
Das liegt wohl daran, dass der SQL-Parser die Abfrage schon überprüft bevor er sie überhaupt stellt. Vielleicht hilft es Dir, den SpaltenNamen in eine Variable zu stecken und diese dann im inneren SELECT zu verwenden -> weiß ich aber nicht genau.
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
BINGO!
declare @spaltenname varchar(30)
set @spaltenname='mtypp'
if exists(select column_name from information_schema.columns where table_name='mitarbeiter' and column_name='mtypp')
exec('select '+@spaltenname+' from mitarbeiter')
else
select 'sorry, rockt nich...'
So funktioniert es. Dankeschön für deine Unterstützung!
-----------(edit)
Mhmm Problem zwei. Da ich meine select-Abfrage nun in exec packen muss: Wie kann ich in exec WHERE-Abfragen durchführen, welche die einfachen Anführungszeichen benötigen? oO
exec ( 'select ' + @spalte+ ' from TABELLE where spalte='bla'');
Das kann ja nicht funktionieren, da die Anführungszeichen den exec-string unterbrechen. Habe es mit dem doppelten Anführungszeichen probiert, das erkennt er nicht an. Und spezielle Zeichenfolgen wie ' scheint T-SQL nicht zu kennen.
Du kannst das mit doppelten Anführungszeichen escapen: Aber es müssen wirklich zwei einzelne Zeichen gemacht werden, also '' und nicht "
'select '+@spaltenname+' from TABELLE where Textfeld=''testWert'''
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca