Announcement

Collapse
No announcement yet.

StoredProcedure: Tabellennamen als Variable?

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

  • StoredProcedure: Tabellennamen als Variable?

    Hallo zusammen,

    ich habe eine vorhandene StoredProcedure die ich umbauen möchte,
    aber so:


    /****** Objekt: StoredProcedure [dbo].[pwr_referenz] Skriptdatum: 08/14/2008 15:45:01 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO

    ALTER PROCEDURE [dbo].[pwr_referenz]
    -- Add the parameters for the stored procedure here
    @datum varchar(10)
    , @referenz_id int = 0
    , @referenz varchar(30)
    AS
    BEGIN
    Declare @gueltig_von as datetime
    , @gueltig_bis as datetime
    , @pruef_datum as datetime
    , @dimname as varchar(50)

    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- für DATEDIFF()
    SELECT @pruef_datum = datum
    FROM PWR_AUSGANG
    WHERE CONVERT(varchar(10), datum, 112) = @datum

    -- dim-Verarbeitung
    IF @referenz is not null
    Begin

    SELECT @dimname = name, @gueltig_von = pwr_gueltig_von, @gueltig_bis = pwr_gueltig_bis
    FROM @referenz
    WHERE ID = @referenz_id

    ...
    END
    END


    funktioniert das wohl nicht.

    Was muß ich tun um den Tabellennamen als Variable mit übergeben zu können?

  • #2
    Eine Frage, die schon tausende Male gestellt wurde
    Siehe hier: http://www.insidesql.org/beitraege/e...luch-und-segen

    bye,
    Helmut

    Comment


    • #3
      Hallo Helmut,
      ich hab den Artikel jetzt 7 mal gelesen, aber leider gehts da mehr ums abraten denn ums erklären an sich. Viele Gründe warum man nicht dynamic sql nehmen soll treffen aber bei meinem Projekt gar nicht zu, so daß ich es doch zumindest mal versuchen möchte. Hast Du evtl. einen Tipp (Link) wo ein bisschen mehr das 'wie' erklärt wird?

      Vielen Dank schon mal!

      Jürgen

      Comment


      • #4
        Ich habe die Prozedur mal testweise so zusammengekürzt:
        USE [Best-Support]
        GO
        /****** Objekt: StoredProcedure [dbo].[pwr_referenz] Skriptdatum: 08/21/2008 11:39:53 ******/
        SET ANSI_NULLS ON
        GO
        SET QUOTED_IDENTIFIER ON
        GO

        ALTER PROCEDURE [dbo].[pwr_referenz]
        -- Add the parameters for the stored procedure here
        @datum varchar(10)
        , @referenz_id int
        , @referenz varchar(30)
        , @mastertable varchar(30)
        AS
        BEGIN
        Declare @gueltig_von as datetime
        , @gueltig_bis as datetime
        , @pruef_datum as datetime
        , @dimname as varchar(50)
        , @sql as nvarchar(500)

        -- SET NOCOUNT ON added to prevent extra result sets from
        -- interfering with SELECT statements.
        SET NOCOUNT ON;

        -- TRUNCATE TABLE hilf_mail

        -- für DATEDIFF()
        SELECT @pruef_datum = datum
        FROM PWR_AUSGANG
        WHERE CONVERT(varchar(10), datum, 112) = @datum

        -- dim_ursachenklassifikation-Verarbeitung
        IF @referenz is not null
        Begin

        SELECT @sql = N'SELECT name, pwr_gueltig_von, pwr_gueltig_bis
        FROM ' + @referenz + '
        WHERE ID = ''' + @referenz_id + ''''
        EXEC sp_executesql @sql, @referenz, @referenz_id, @dimname OUTPUT, @gueltig_von OUTPUT, @gueltig_bis OUTPUT

        END
        END

        Ich rufe das ganze nun mit:
        USE [Best-Support]
        GO
        EXEC [pwr_referenz] '20080820','16','dim_einganggskanal','PWR_AUSGANG'

        auf.

        Das ganze liefert als Fehlermeldung:

        Meldung 245, Ebene 16, Status 1, Prozedur pwr_referenz, Zeile 53
        Fehler beim Konvertieren des nvarchar-Wertes 'SELECT name, pwr_gueltig_von, pwr_gueltig_bis
        FROM dim_einganggskanal
        WHERE ID = '' in den int-Datentyp.


        -> Er hat wohl das einsetzen des Tabellennamens (der dritte Parameter) gemacht, den zweiten aber wohl nicht.

        Ein Test mit:

        SELECT @sql = N'SELECT name, pwr_gueltig_von, pwr_gueltig_bis
        FROM ' + @referenz + '
        WHERE ID = ' + @referenz_id
        EXEC sp_executesql @sql, @referenz, @referenz_id, @dimname OUTPUT, @gueltig_von OUTPUT, @gueltig_bis OUTPUT


        liefert:

        Meldung 245, Ebene 16, Status 1, Prozedur pwr_referenz, Zeile 53
        Fehler beim Konvertieren des nvarchar-Wertes 'SELECT name, pwr_gueltig_von, pwr_gueltig_bis
        FROM dim_einganggskanal
        WHERE ID = ' in den int-Datentyp.


        Irgendwie setzt er die ID da nicht ein.
        Wo ist da noch der Fehler?

        Comment


        • #5
          Besser erklären als es dort drinnen steht kann man es nicht, glaube ich (habe zumindest noch nichts besseres gefunden).
          Und der Fehlermeldung nach vermute ich eher mal, du hast da irgendwo sowas wie
          select @ergebnis = @sql ...
          stehen, in @sql steht dein gesamtes Statement und das sollte jetzt in einen Integer umgewandelt werden. Kann aber auch sein, dass du beim Erstellen des Strings zuviele Hochkommas verwendest. Probiere es doch mal einfach so:

          SELECT @sql = N'SELECT name, pwr_gueltig_von, pwr_gueltig_bis FROM ' + @referenz + ' WHERE ID = ' + cast(@referenz_id as nvarchar)

          bye,
          Helmut

          Comment

          Working...
          X