Announcement

Collapse
No announcement yet.

Problem mit variablem Spaltennamen

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

  • Problem mit variablem Spaltennamen

    Hallo zusammen,

    ich versuche eine SP im SQL Server 2005 zu erstellen und habe folgendes Problem :

    DECLARE @machineCount as INT
    SELECT @machineCount = MachineCounter FROM dbo.MachineCounts
    DECLARE @curFlag as BIT
    DECLARE @curMachine as NVARCHAR(50)
    DECLARE @loopVar as INT

    SET @loopVar = 1

    WHILE @loopVar != @machineCount
    BEGIN
    SET @curMachine = 'MachineID' + cast(@loopVar as NVARCHAR(10))
    SELECT @curFlag = @curMachine FROM dbo.MachineStates WHERE [...]

    IF @curFlag = 1
    BEGIN
    -- mach was
    END
    END

    In der Zeile
    SELECT @curFlag = @curMachine FROM dbo.MachineStates WHERE [...]

    knallt es mit der Fehlermeldung, @curMachine könnte nicht in BIT konvertiert werden. Es scheint so zu sein als ob er keine Variable als Spaltennamen in der SELECT-Abfrage zulässt. Ich habe es daher auch schon mit

    EXEC @curFlag = 'SELECT ' + @curMachine + ' FROM dbo.MachineStates WHERE [...]' versucht, aber leider lässt er das auch nicht zu.

    Kann mir jemand sagen, wie ich den variablen Spaltennamen hier für die Zuweisung von @curFlag verwenden kann ?

    Danke...

  • #2
    Auch wenn ich dich gestern als "Mensch" bezeichnet hatte, will ich dir ein bisschen helfen.

    1. Code ist auch im Entwickler-Forum als solcher zu markieren, zumindest durch den #-Button und noch besser durch [highlight=sql].

    2. Für MS-SQL Server gibt es ein passendes Unterforum. Dorthin gehört die Frage, siehe auch Was gehört hierher?. Also muss Falk die Diskussion verschieben, weil du nicht aufpasst.

    3. Wie auch im Parameter-Artikel erläutert (denn kennst du hoffentlich, auch wenn du Parameter nicht benutzen willst), gehen solche variablen Maßnahmen nicht für Tabellen- und Spaltennamen. Du kannst stattdessen eine CASE-WHEN-Konstruktion verwenden, musst dann aber natürlich alle denkbaren Varianten unterbringen.

    Gruß Jürgen

    Comment


    • #3
      Dynamic SQL macht man besser mit SP_ExecuteSQL anstatt mit Exec...
      ungefähr so

      [HIGHLIGHT="SQL"]DECLARE @CurFlag BIT;
      DECLARE @Params = N'@CurFlag BIT OUTPUT';
      DECLARE @Stmt = N'SELECT @CurFlag = ' + @curMachine + ' FROM dbo.MachineStates WHERE [...]'
      EXEC sp_ExecuteSQL @Stmt, @Params, @CurFlag=@CurFlag OUTPUT;
      SELECT @CurFlag[/HIGHLIGHT]

      Comment


      • #4
        Danke, aber ich hab mittlerweile aufgegeben und den Teil in eine .NET Assembly ausgelagert, funktioniert jetzt wie gewünscht.

        @Jürgen
        Was meine Frage mit der .NET Parameter Klasse zu tun hat, weiß auch nur der Wind ?
        CASE/WHEN ist keine Option, da die Anzahl der Möglichkeiten theoretisch unendlich ist. Es geht aber auch grundsätzlich auf SQLServer Seite, nämlich wenn man die SELECT-Abfrage in einer seperaten SP in einer VARCHAR-Variablen zusammensetzt und mittels EXECUTE ausführt. Dann kann man EXEC @parameterName = SeperateSP (spaltenname, tabellenname, ...) machen. Ist mir aber zu unschön.

        Comment

        Working...
        X