Laden...

SQL Server 2005 - Spalte auslesen wenn sie existiert.

Erstellt von Dr.Cool vor 17 Jahren Letzter Beitrag vor 17 Jahren 12.619 Views
Dr.Cool Themenstarter:in
137 Beiträge seit 2005
vor 17 Jahren
SQL Server 2005 - Spalte auslesen wenn sie existiert.

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?

N
4.644 Beiträge seit 2004
vor 17 Jahren

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'
Dr.Cool Themenstarter:in
137 Beiträge seit 2005
vor 17 Jahren

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?

1.985 Beiträge seit 2004
vor 17 Jahren

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

Dr.Cool Themenstarter:in
137 Beiträge seit 2005
vor 17 Jahren

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.

Dr.Cool Themenstarter:in
137 Beiträge seit 2005
vor 17 Jahren

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?

3.170 Beiträge seit 2006
vor 17 Jahren

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

Dr.Cool Themenstarter:in
137 Beiträge seit 2005
vor 17 Jahren

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?

3.170 Beiträge seit 2006
vor 17 Jahren

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

Dr.Cool Themenstarter:in
137 Beiträge seit 2005
vor 17 Jahren

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*

3.170 Beiträge seit 2006
vor 17 Jahren

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

Dr.Cool Themenstarter:in
137 Beiträge seit 2005
vor 17 Jahren

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.

Dr.Cool Themenstarter:in
137 Beiträge seit 2005
vor 17 Jahren

Hat niemand eine Idee?

3.170 Beiträge seit 2006
vor 17 Jahren

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

Dr.Cool Themenstarter:in
137 Beiträge seit 2005
vor 17 Jahren

Ok danke - hab dir heut viel zu verdanken - jetzt funktioniert alles.