Announcement

Collapse
No announcement yet.

Einen Tabellennamen via Variable übergeben in T-SQL Funktion

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • 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
    Müßtest du dynamisch via EXECUTE bzw. EXECUTE sp_executesql ausführen.

    Comment


    • #3
      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?
      [highlight=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 ? */[/highlight]
      Das obige gibt SYSINDEX aus (nur als Beispiel). Ich würde SYSINDEX gerne in der @sqlReturn Variable speichern. Wie geht das?

      Comment


      • #4
        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
        Zuletzt editiert von mwelling; 07.06.2016, 09:08.

        Comment


        • #5
          @mwelling: prima so geht es! Danke für Deinen Tipp! Falls das auch mal jemand brauchen/suchen sollte. Ich mache das in etwa so:
          [highlight=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
          [/highlight]Und dann kann ich den Workaround so verwenden:
          [highlight=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
          [/highlight]
          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)?

          Comment

          Working...
          X