none
Do Loop in TSQL? RRS feed

  • Frage

  • Hallo zusammen,

    zur Zeit stelle ich ein Access-Backend auf den SQL Server 2012 SP1 Express um. In VBA habe ich diese kleine Funktion die während eines Dateiimportes läuft:

    Set rsInvestition = CurrentDbC.OpenRecordset("TInvestition", dbOpenDynaset, dbSeeChanges)
        Set rsImport = CurrentDbC.OpenRecordset("TInvestition_Import", dbOpenDynaset, dbSeeChanges)
        Do Until rsInvestition.EOF
            dblRechnungsbetrag = 0
            Do Until rsImport.EOF
                If rsInvestition!fldAuftragsnummer = rsImport!fldAuftragsnummer Then
                    dblRechnungsbetrag = Nz(rsInvestition!fldRechnungsbetrag, 0)
                    dblRechnungsbetrag = dblRechnungsbetrag + Nz(rsImport!fldRechnungsbetrag, 0)
                    rsInvestition.Edit
                    rsInvestition!fldRechnungsbetrag = dblRechnungsbetrag
                    rsInvestition.Update
                End If
                rsImport.MoveNext
            Loop
            rsImport.MoveFirst
            rsInvestition.MoveNext
        Loop
    Kann mir jemand Stichpunkte geben wie man so etwas mit Hilfe von TSQL direkt auf dem SQL Server ausführen kann?

    Vielen Dank schon im Voraus.


    Servus
    Winfried

    Gruppenrichtlinien
    WSUS Package Publisher
    HowTos zum WSUS Package Publisher
    NNTP-Bridge für MS-Foren

    Donnerstag, 20. Februar 2014 20:50

Antworten

  • Hallo Winfried,

    man kann sowas mit einem Cursor zwar machen, sinnvoll ist es nicht, da SQL nunmal mengenorientiert arbeitet und nicht zeilenorientiert.

      http://technet.microsoft.com/de-de/library/ms180169.aspx

    Wenn ich deinen Code aber richtig lese, brauchst Du weder deine Funktion noch eine Schleife. Du müsstest lediglich die beiden Tabellen miteinander verbinden und dann ein UPDATE auf die Zieltabelle machen. Die Berechnung kann direkt im SQL Statement erfolgen.

    WITH Query AS ( SELECT ISNULL( t.fldRechnungsbetrag, 0 ) AS fldRechnungsbetrag_Investition, ISNULL( ti.fldRechnungsbetrag, 0 ) AS fldRechnungsbetrag_Import,
    t.Auftragsnummer FROM TInvestition t INNER JOIN TInvestition_Import ti ON t.fldAuftragsnummer = tu.fldAuftragsnummer ) UPDATE TInvestition SET fldRechnungsbetrag = Query.fldRechnungsbetrag_Investition + Query.fldRechnungsbetrag_Import FROM Query WHERE Auftragsnummer = Query.Auftragsnummer

    Das Statement könnte noch fehlerhaft sein, habs grade nur so dahingeschrieben. Vom Grundsatz her sollte aber klar sein, was ich damit meine. Falls nicht, einfach fragen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Donnerstag, 20. Februar 2014 21:03
    Moderator

Alle Antworten