Announcement

Collapse
No announcement yet.

Variabler Select unter MS SQL 7.0 / 2000

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

  • Variabler Select unter MS SQL 7.0 / 2000

    Hallo ich habe folgendes Problem:
    - ich möchte einen select absetzen, der genau einen wert in einer vorher deklarierten variable speichert.
    z.B.
    set @Var1 =(select Wert1 from myTable)

    Das Problem ist myTable kann sich ändern. Während Variablen in einer Where-Klausel funktionieren, klappt folgendes Shema nicht:
    set @myTabel = 'myTableTest'
    set @Var1 =(select Wert1 from @myTable)

    beim zusammenstringen des SQLs und einer Ausführung per exec, habe ich keine Möglicheit den wert in eine Variablen zu speichern.
    Beispiel:
    set @myTabel = 'myTableTest'
    set @strSQL = 'select Wert1 from ' + @myTable
    exec @strSQL
    -->set @var1 = (exec(@strSQL)<--

    ich möchte nicht mit einem cursor arbeiten, da die entstehenden Stored Proc. dann sehr unperformant werden würde. Das Problem ist ziemlich komplex und ist jetzt hier nur auf die Beispiele reduziert. Vieleicht kann mir ja jemand helfen.

    Danke
    Claas

  • #2
    Hallo Claas,<BR><BR>ja, das ist das alte Leid. Aber über eine tempräre Tabelle ist das Problem lösbar:<BR><PRE>
    set nocount on
    --
    create table #a (id int identity(1,1) primary key, SpalteA int, SpalteB int)
    create table #b (id int identity(1,1) primary key, SpalteA int, SpalteB int)
    --
    insert into #a values(1,2)
    insert into #a values(2,3)
    insert into #b values(3,4)
    insert into #b values(5,6)
    --
    create table #c (id int identity(1,1) primary key, Ergebnis int)
    --
    declare
    @vcExec varchar(1000)
    ,@iValue int
    ,@vcTableName varchar(100)
    ,@vcColumnName varchar(100)
    ,@iID int
    --
    set @vcTableName = '#a'
    set @vcColumnName = 'SpalteA'
    set @iID = 1
    --
    set @vcExec = 'select ' + @vcColumnName + ' from ' + @vcTableName + ' where id = ' + cast(@iID as varchar)
    insert into #c
    exec(@vcExec)
    select @iValue = Ergebnis from #c
    print @iValue
    --
    --
    truncate table #c
    set @vcTableName = '#b'
    set @vcColumnName = 'Spalteb'
    set @iID = 2
    --
    set @vcExec = 'select ' + @vcColumnName + ' from ' + @vcTableName + ' where id = ' + cast(@iID as varchar)
    insert into #c
    exec(@vcExec)
    select @iValue = Ergebnis from #c
    print @iValue
    --
    drop table #a
    drop table #b
    drop table #c
    --
    set nocount off
    </PRE>
    Das Ganze kann man dann natürlich noch schön in eine StoredProcedure verpacken, die dann das gewünschte Ergebnis über eine OUTPUT Variable zurückgibt. Es soll ja nur das Prinzip verdeutlichen....<BR><BR>Viele Grüße Ola

    Comment


    • #3
      Das Prinzip scheint nicht schlecht. Jetzt stellt sich nur die Frage ob das Erstellen der Tabelle, das Einfügen, das Ausführen und das letztendliche Löschen der Tabelle schneller ist als eine Cursor-Operation. Ich werde das ganze bei mir mal testen. Solltest du da Erfahrungen haben, würde ich mich über eine Antwort freuen.

      Gruß
      Claa

      Comment


      • #4
        Hallo Claas,<BR><BR>natürlich ist diese Lösung nicht superschnell, da durch die Exec-Anweisung nicht der komplette Code in kompilierter Form in einer Procedure vorliegen kann. Es muss zur Laufzeit also ein gewisser Aufwand betrieben werden. Eine temporäre Tabelle ist allerdings etwas schneller als eine normale, da hier einige Protokolleinträge wegfallen. Auch um das Löschen muss man sich eigentlich nicht kümmern. Du musst diese Tabelle ja eigentlich auch nicht immer wieder löschen und neu erstellen, sondern nur die Einträge für dein neues Exec löschen (truncate table).<BR>Mir ist allerdings nicht ganz klar wie du dein Problem über einen CURSOR lösen willst. Vielleicht kannst du doch etwas genauer deine Problematik schildern, vielleicht fällt mir da auch noch ein anderer Ansatz ein?!<BR><BR>Übrigens ist mir noch eine vielleicht etwas elegantere Lösung eingefallen über eine veränderliche View, allerdings musst du da im Mehrbenutzerbetrieb mit Sperren usw. eine Menge drumherum beachten. Hier das Prinzip:<PRE>Create Table aaa(a int, b int)
        Create Table bbb(a int, b varchar(10))
        Create Table ccc(a int, b datetime)
        --
        insert into aaa values(1,2)
        insert into aaa values(3,4)
        insert into bbb values(5,'6')
        insert into bbb values(7,'8')
        insert into ccc values(9,'20030709')
        insert into ccc values(11,'20040101')
        GO
        Create View TempView
        as
        select * from aaa
        GO
        Create Procedure ModiView
        (
        @vcViewName varchar(100)
        ,@vcTableName varchar(100)
        )
        as
        declare
        @vcExec varchar(1000)
        set @vcExec= 'Alter View ' + @vcViewName + ' as select * from ' + @vctableName
        Exec(@vcExec)
        GO
        --
        declare
        @vcData as varchar(10)
        ,@dtData as Datetime
        --
        exec ModiView 'TempView', 'bbb'
        select @vcData = b from TempView where a = 5
        print @vcData
        --
        exec ModiView 'TempView', 'ccc'
        select @dtData = b from TempView
        print @dtData
        </PRE>Viele Grüße Ola

        Comment

        Working...
        X