Willkommen bei Entwickler-Forum.
Ergebnis 1 bis 5 von 5
  1. #1
    Gesperrt
    Registriert seit
    29.03.2011
    Beiträge
    66

    Standard Einen Tabellennamen via Variable übergeben in T-SQL Funktion

    Hallo Forum,

    ich würde gerne in einer T-SQL Funktion (via Sybase ASE Datenbank) eine Tabelle abfragen, deren Namen eine Variable ist, die der Funktion übergeben wurde. Es scheinen aber nur feste Namen als Tabellennamen möglich zu sein und keine Variablen. Kann das sein?

    Code:
    SET @value = (SELECT "Wert" FROM @tableName WHERE ID=@id)
    Gibt ein "Tabelle '@tableName' nicht gefunden" zurück d.h. der Inhalt der Variable wird nicht ausgepackt sondern 1:1 so gelesen, wie der Text dort steht. Wie könnte ich das sonst machen?

    Grüße
    Wursel

  2. #2
    Stammgast
    Registriert seit
    26.02.2003
    Beiträge
    4.825

    Standard

    Müßtest du dynamisch via EXECUTE bzw. EXECUTE sp_executesql ausführen.

  3. #3
    Gesperrt
    Registriert seit
    29.03.2011
    Beiträge
    66

    Standard

    Den Befehl sp_executesql gibt es bei mir leider nicht (Sybase ASE 9 DB). Aber mit EXECUTE kann ich tatsächlich eine mit variablen Namen zusammengebaute SQL Query erfolgreich ausführen. Jetzt fehlt mir nur noch die Möglichkeit, das Ergebnis (der Rückgabewert/Output der SQL-Abfrage) in einer Variable zu speichern. Wie kann ich das machen?
    Code SQL:
    DECLARE @tableName CHAR (255)
    SET @tableName='sysobjects'
     
    DECLARE @id CHAR(255)
    SET @id='100003'
     
    DECLARE @sqlQuery CHAR(255)
    SET @sqlQuery = 'SELECT name FROM ' + @tableName + ' WHERE id = ''' + @id + ''''
     
    DECLARE @sqlReturn CHAR(255)
    SET @sqlReturn='' 
     
    EXECUTE (@sqlQuery)  /* => Ausgabe in @sqlReturn ablegen ? */
    Das obige gibt SYSINDEX aus (nur als Beispiel). Ich würde SYSINDEX gerne in der @sqlReturn Variable speichern. Wie geht das?

  4. #4
    Neuer Benutzer
    Registriert seit
    20.05.2016
    Beiträge
    4

    Standard

    Ohne es getestet zu haben, versuche mal das:

    Code:
     
    ...
    DECLARE @sqlQuery CHAR(255)
    DECLARE @sqlReturn CHAR(255)
    SET @sqlQuery = 'SET ' + @sqlReturn + ' = (SELECT TOP 1 name FROM ' + @tableName + ' WHERE id = ''' + @id + ''')'
    EXECUTE (@sqlQuery)  /* => Ausgabe in @sqlReturn ablegen ? */
    RETURN @sqlReturn
    Geändert von mwelling (07.06.2016 um 10:08 Uhr)

  5. #5
    Gesperrt
    Registriert seit
    29.03.2011
    Beiträge
    66

    Standard

    @mwelling: prima so geht es! Danke für Deinen Tipp! Falls das auch mal jemand brauchen/suchen sollte. Ich mache das in etwa so:
    Code SQL:
    CREATE FUNCTION testExecSQL(
    	 @sqlCommand				VARCHAR(255)
    )	 RETURNS				VARCHAR(255)
    AS
    BEGIN
    	DECLARE @sqlReturn VARCHAR(255)
    	SET @sqlReturn=''
     
    	DECLARE @sqlQuery VARCHAR(255)
    	SET @sqlQuery = 'SET @sqlReturn = (' + @sqlCommand + ')'
     
    	EXECUTE(@sqlQuery)
    	RETURN @sqlReturn
    END
    Und dann kann ich den Workaround so verwenden:
    Code SQL:
    DECLARE @tableName VARCHAR(255)
    SET @tableName='sysobjects'
     
    DECLARE @id VARCHAR(255)
    SET @id='100003'
     
    DECLARE @test VARCHAR(255)
    SET @test = testExecSQL('SELECT TOP 1 name FROM ' + @tableName + ' WHERE id = ''' + @id + '''')
    SELECT @test
    Gibt mir dann "SYSINDEX" als Antwort aus.

    Rein interessehalber: Wenn man mehr als einen Wert bräuchte (entweder horizontal oder vertikal oder beides). Könnte man sich auch eine Tabelle zurück liefern lassen (in Sybase ASE)?

 

 

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •