knifflige SQL-Frage
Volker
- datenbank
0 Ludwig Ruderstaller0 Volker0 Tom0 Volker
0 Michael Schröpl
Hallo Forum'ler
ich habe da mal ein kniffliges SQL-Problem und hoffe, daß es unter euch ein paar Gurus gibt, die mir da weiterhelfen können ... (genug der Motivation ;-)
Folgendes Szenario:
Ich benutze einen Sybase SQL-Server, den ich via ASP abfrage.
Auf dem DB-Server existiert eine Tabelle 'TAB1' mit den Spalten 'SPALTE1' bis 'SPALTE5'.
Außerdem gibt es eine Stored Procedure 'SP1', welche einen Char-Parameter erhält. Dies sieht etwa so aus:
Create Procedure SP1 @param1 varchar(7)
As
Begin
...
End
Dieser Parameter enthält jetzt eine Spaltenbezeichnung - also beispielsweise den String 'SPALTE1', und die Procedure soll jetzt den Inhalt dieser Spalte ausgeben.
An der SQL-Syntax beiß' ich mir irgendwie die Zähne aus. Was ich natürlich schon probiert habe, was aber nicht funktioniert ist:
'Select @param1 From TAB1' - hier gibt er lediglich den String 'SPALTE1' aus, aber nicht den Inhalt der Tabellenspalte.
Für jegliche Hilfe oder Anregungen wäre ich dankbar.
Volker
'Select @param1 From TAB1' - hier gibt er lediglich den String 'SPALTE1' aus, aber nicht den Inhalt der Tabellenspalte.
SELECT * FROM TAB1 WHERE @param1 LIKE 'xxxx';
oder was meinst du, du schreibst zb.
Dieser Parameter enthält jetzt eine >Spaltenbezeichnung - also beispielsweise den >String 'SPALTE1',
[..]
'Select @param1 From TAB1' - hier gibt er lediglich >den String 'SPALTE1' aus, aber nicht den Inhalt der >Tabellenspalte.
Was willst du ... er macht ja das was du willst, du willst den inhalt von spalte1, dessen inhalt spalte 1 ist.
Genauer erklären, und keine so blöden fantasie namen, du siehst du kommst selbst durcheinander
lg
Ludwig
Sorry, wenn es etwas mißverständlich beschrieben ist ... ich versuch' es noch mal:
Die Procedure 'SP1' soll so dynamisch sein, daß sie den Inhalt der Spalte der Tabelle 'TAB1' ausgibt, die im Parameter 'PARAM1' spezifiziert wird.
Enthält der Parameter den Wert 'SPALTE1', so soll der Inhalt der Spalte 'SPALTE1' der Tabelle 'TAB1' ausgegeben werden. Dies sind dann beispielsweise alle Geburtsdaten, oder bei 'SPALTE2' beispielsweise alle Namen.
benutze ich jetzt 'Select @PARAM1 From TAB1', so liefert er mir nicht oben genannte Geburtsdaten zurück, sondern nur den Parameter.
irgendwie muß ich ihm klar machen, daß er den Wert von 'PARAM1' als Spaltenbezeichnung nehmen, und nicht diesen Wert zurückliefern soll.
Ich hoffe, es ist jetzt verständlicher ;-)
Volker
Hallo Volker
Du wirst in jedem Fall das Select-Statement zuerst als String zusammenbauen müssen, bevor es ausgeführt wird.
Falls Du es als Stored-Procedure auf dem SQL-Server realisiern willst, dann sieht es etwa so aus:
CREATE PROCEDURE getSpalte @SpaltenName varchar(10)
AS
EXEC ("SELECT " + @SpaltenName + " FROM Tab1")
GO
Dies ist die Syntax, wie sie bei MS-SQL verwendet wird. Bei Sybase wird es aber sicher nicht viel anders sein, da MS-SQL in seiner ersten Version auf einer alten Version von Sybase aufbaut. Suche in der Doku zu Sybase nach einem Befehl zum Ausführen von Zeichenketten als SQL-Statement (z.B. EXECute).
Natürlich (und IMHO sinnvollerweise) kannst Du das SQL-Statement auch in der ASP-Umgebung zusammenbauen und dann anschliessend ausführen lassen.
Verwende dazu die Standard String-Operation zum Verketten von Strings und übergebe den Ergebnisstring an die SQL-Execute-Funktion des Datenbankobjektes.
Da ich ich in ASP nicht so fit bin, wird Dir hier jemand anderes weiterhelfen müssen.
Grüsse
Tom
Hallo Tom,
Danke für den heißen Tip ... ich dachte, das isses ... ;-( leider ist die Abstammung des SybaseSystems vom MS-SQLServer wohl doch schon etwas her ... jedenfalls habe ich keinen Befehl gefunden, der eine ZF als SQL-Befehl interpretiert.
Ich werde es wahrscheinlich so machen, wie in dem Posting vor Deinem beschrieben - auch wenn damit die angestrebte Flexibilität natürlich nicht erreicht wird.
Trotzdem danke für den Tip.
Volker
Enthält der Parameter den Wert 'SPALTE1', so soll der Inhalt der Spalte 'SPALTE1' der Tabelle 'TAB1' ausgegeben werden. Dies sind dann beispielsweise alle Geburtsdaten, oder bei 'SPALTE2' beispielsweise alle Namen.
Ich kenne weder Sybase noch die Sprache, in der Du dort stored procedures schreiben kannst (in Oracle wäre das PL/SQL), aber Dein Problem sieht für mich so aus, daß Du zwar dort zwar SQL-Kommandos generieren kannst, daß aber Dein Parameter (vom Typ "char") dort als *Literal* eingesetzt wird.
benutze ich jetzt 'Select @PARAM1 From TAB1', so liefert er mir nicht oben genannte Geburtsdaten zurück, sondern nur den Parameter.
Was durch Dein Statement tatsächlich generiert wird, ist
SELECT 'PARAM1' FROM TAB1;
, und genau das kommt auch heraus, nämlich das Literal 'PARAM1' (auf die Tabelle wird überhaupt nicht zugegriffen).
irgendwie muß ich ihm klar machen, daß er den Wert von 'PARAM1' als Spaltenbezeichnung nehmen, und nicht diesen Wert zurückliefern soll.
Kann Deine Stored-Procedures-Sprache so etwas wie "if"? (PL/SQL kann das.) Dann ungefähr so:
if @PARAM1 == 'PARAM1'
then "SELECT PARAM1 FROM TAB1;"
else ...
Das ist nicht so elegant wie Deine Lösung, aber ...
Und die Syntax stimmt natürlich nur näherungsweise.