Announcement

Collapse
No announcement yet.

Brauche Hilfe bei StoredProcedure: Insert durch Update ersetzen?

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

  • Brauche Hilfe bei StoredProcedure: Insert durch Update ersetzen?

    Hallo zusammen,

    ich hoffe von Euch kann mir einer helfen.
    Ich habe eine SP die aufgerufen wird um Datensätze zu kopieren. Das hat bisher auch gut funktioniert, aber jetzt hat die betroffene Tabelle eine, ich nenn sie mal "Erweiterungstabelle" bekommen. In dieser darf der Kunde eigene Spalten anlegen, die er sich dann im Programm anzeigen lassen und bearbeiten kann. Das ganze wird dann in einer View entsprechend zusammengeführt.
    Wenn nun (in meinem Fall sind es Warenkörbe) ein neuer Datensatz angelegt wird, wird über einen Trigger ein Datensatz in der Erweiterungstabelle angelegt, welcher dann schon mal die Grundinformationen enthält.
    Für das Kopieren eines Warenkorbes gibt es noch eine weitere Tabelle, in der der Kunde definieren kann, welche Spalten aus der Erweiterungstabelle mit kopiert werden sollen.

    Hier der betreffende Teil meiner SP
    [highlight=sql]
    ALTER PROCEDURE [dbo].[Copy_TM_Warenkorb2TM_Warenkorb] @QWKID int, @ZWKID int
    AS
    declare @WSSpalten varchar(4000)
    declare @SQL varchar (8000)

    -- TS_Warenkorb-Einträge kopieren
    select @WSSpalten = (Select Spaltenliste from TM_Tabellen_Spalten WHERE TabellenName='TS_Warenkorb' AND Operation ='Kopieren')
    IF ( isnull(@WSSpalten,'')!='' )
    begin
    Delete FROM TS_Warenkorb WHERE WarenkorbID=@ZWKID
    set @SQL = 'INSERT INTO TS_Warenkorb (WarenkorbID,' + @WSSpalten + ') SELECT ' + cast(@ZWKID as varchar(12)) + ',' + @WSSpalten + ' FROM TS_Warenkorb WHERE WarenkorbID =' + cast(@QWKID as varchar(12)) + ''
    execute (@SQL)
    end
    [/highlight]

    Um den Eintrag "kopieren" zu können, muss ich den bereits generierten Eintrag löschen und dann den neuen per INSERT einfügen.
    Kann ich dieses INSERT irgendwie durch ein UPDATE ersetzen?

    Das hier meine ich:
    [highlight=sql]
    set @SQL = 'INSERT INTO TS_Warenkorb (WarenkorbID,' + @WSSpalten + ') SELECT ' + cast(@ZWKID as varchar(12)) + ',' + @WSSpalten + ' FROM TS_Warenkorb WHERE WarenkorbID =' + cast(@QWKID as varchar(12)) + ''
    [/highlight]

    Kann mir da jemand helfen?


    EDIT: Ich arbeite mit einem SQL-Server 2012

  • #2
    Bei 2012 bietet sich da Merge an (1.tes Beispiel ansehen).

    Comment


    • #3
      Das sieht nicht schlecht aus. Danke Ralf.
      Mein Kollege hat mich grad darauf aufmerksam gemacht, das ich zwar mit dem 2012er arbeite, aber bei den Kunden teilweise 2005 oder bei ein oder zwei noch 2003 läuft. Wobei ich denke letztere kann ich vernachlässigen.
      Gibts ne Lösung die für 2005 und höher gemeinsam funktioniert?

      Comment


      • #4
        Das gleiche Beispiel. Sieh nochmal genau hin.

        Comment


        • #5
          hmm...ich denke, du meinst das hier:
          [highlight=sql]
          CREATE PROCEDURE dbo.InsertUnitMeasure
          @UnitMeasureCode nchar(3),
          @Name nvarchar(25)
          AS
          BEGIN
          SET NOCOUNT ON;
          -- Update the row if it exists.
          UPDATE Production.UnitMeasure
          SET Name = @Name
          WHERE UnitMeasureCode = @UnitMeasureCode
          -- Insert the row if the UPDATE statement failed.
          IF (@@ROWCOUNT = 0 )
          BEGIN
          INSERT INTO Production.UnitMeasure (UnitMeasureCode, Name)
          VALUES (@UnitMeasureCode, @Name)
          END
          END;
          GO
          [/highlight]

          Ich bin mir allerdings nicht sicher, wie ich das auf meinen Fall anwenden kann.
          Die Spalten die kopiert werden sollen, also per UPDATE aktualisiert werden sollen, stehen ja als kommagetrennter String in @WSSpalten. Und das kann ja jeder beliebeige Spaltentyp sein.

          Comment


          • #6
            Den String wirst du in einzelne Columns zerlegen müssen um ein passendes Update SQL zu basteln. Mir ist kein Update Syntax bekannt bei dem man mit einer Column Liste arbeiten könnte.

            Comment


            • #7
              hmm...ok. Gibt es da sowas wie eine Split-Funktion wo man dann drüber schleifen kann?

              Comment


              • #8
                Du kannst du die ganz normalen SQL Methoden verwenden.

                Ich vermute mal du wirst über die Zeichen des string iterieren müssen. Hilfreich wären dann CHARINDEX zum finden des Trennzeichens sowie SUBSTRING zum herausschneiden eines Eintrags.

                Comment


                • #9
                  Ok, dann werde ich mich mal da durch wühlen.
                  Vielen Dank Ralf

                  Grüße aus Karslruhe
                  Andi

                  Comment

                  Working...
                  X