Announcement

Collapse
No announcement yet.

Dynamisch: SET @VARIABLE

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

  • Dynamisch: SET @VARIABLE

    Servus,

    rätsl gerade an ein problemchen!

    ############################################
    USE XYZ_DB

    DECLARE
    @YWERT int,
    @table nvarchar(20),
    @ergebnis nvarchar(255)

    SET @YWERT = '20'
    SET @table = 'tbl_test'

    SET @ergebnis = (SELECT AVG(X) FROM @table WHERE Y = @YWERT) -- Problem Zeile

    ############################################

    Dies soll später in einer prozedur geschehen und die Variable @table wird dann als übergabe mitgeliefert.

    Momentan bekomme ich diese Meldung -> Die "@table"-Tabellenvariable muss deklariert werden.


    Vielen Dank für eure hilfe/bemühung!

  • #2
    Hallo Afru23,

    was Du vorhast nennt sich "dynamisches SQL", zu dem Stichwort findest hier im Forum einige Beiträge; einfach mal suchen.

    Ein Beispiel, wie Du es lösen könntest:

    [Highlight=SQL]DECLARE @Datum datetime

    -- Wert in globale Temp-Tabelle schreiben,
    -- da EXECUTE Out-Of-Scope läuft
    EXECUTE ('SELECT GetDate() AS dt INTO ##MyTempTable')
    SET @Datum = (SELECT dt
    FROM ##MyTempTable)

    PRINT @Datum --Kontrollausgabe
    DROP TABLE ##MyTempTable --immer alles schön aufräumen[/HIGHLIGHT]

    Da es mit Sicherheit im Multi-User-Betrieb laufen soll, solltest Du den Namen der globalen Temp-Tabelle ebenfalls dynamisch mit einem Zufallswert generieren (z.B. mit GUID), da es sonst mal rumst.
    Olaf Helper

    <Blog> <Xing>
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich

    Comment


    • #3
      Merci O. Helper!

      Damit hast du mir sehr weitergeholfen

      Comment


      • #4
        Ok, ist Freitag, das Hirn schon träge, die Gedanken kreisen ums Feierabend-Bier ...

        Um eine GUID für den Tabellennamen nutzen zu können, müsste man auch das dynamisch gestalten ... lassen wir mal.

        Es geht natürlich auch eleganten, da man mit SQL 2005 bei sp_executesql endlich auch OUTPUT Parameter bei String-Commands nutzen kann, nicht nur bei SPs.

        [highlight=SQL]DECLARE @Datum datetime
        DECLARE @ParaDef nvarchar(500);

        -- Per OUTPUT Ergebnis zurückliefern lassen
        SET @ParaDef = N'@DatumOUT datetime OUTPUT';
        EXEC sp_executesql N'SELECT @DatumOUT = GetDate()', -- hier FROM + Tab-Name anhängen
        @ParaDef, @DatumOUT = @Datum OUTPUT
        PRINT @Datum --Kontrollausgabe[/highlight]
        Olaf Helper

        <Blog> <Xing>
        * cogito ergo sum * errare humanum est * quote erat demonstrandum *
        Wenn ich denke, ist das ein Fehler und das beweise ich täglich

        Comment


        • #5
          Um es abzuschließen, hier ein "reales" Beispiel, das auch funktioniert; die "AdventureWorks" vorausgesetzt (hat doch jeder, oder?)

          [highlight=SQL]USE AdventureWorks
          GO

          DECLARE @Ausgabe nvarchar(50)
          DECLARE @tbl_name nvarchar(200)
          DECLARE @ParaDef nvarchar(200)
          DECLARE @SQL nvarchar(4000)
          SET @tbl_name = 'Person.Contact'
          SET @ParaDef = N'@AusgabeOUT nvarchar(50) OUTPUT';
          SET @SQL = N'SELECT TOP 1 @AusgabeOUT = EmailAddress ' +
          N'FROM ' + @tbl_name + ' ' +
          N'ORDER BY EmailAddress'
          print @SQL -- Kontrollausgabe SQL
          EXEC sp_executesql @SQL, @ParaDef, @AusgabeOUT = @Ausgabe OUTPUT
          PRINT @Ausgabe -- Kontrollausgabe Ergebnis[/highlight]
          Olaf Helper

          <Blog> <Xing>
          * cogito ergo sum * errare humanum est * quote erat demonstrandum *
          Wenn ich denke, ist das ein Fehler und das beweise ich täglich

          Comment

          Working...
          X