Update beim Insert

osaffi

Grünschnabel
Hallo Zusammen,

ich stehe gerade auf dem Schlauch. Vielleicht komme ich auch gleich darauf und lösche diesen Beitrag, aber vielleicht könnt Ihr mal mitdenken:

Seht ihr eine Möglichkeit schon beim Insert die [Mail] über die Matchingtabelle in den [Mailnickname] zu übersetzen und in die dbo.IDxMail zu schreiben ohne erst nach dem Insert ein Update zu machen?

Unbenannt.JPG

darüber hinaus nutze ich folgende Split Function

Unbenannt.JPG

Danke für die Mithilfe im Voraus!

Hier noch einmal der eigentliche Code ohne Highlights:

Code:
INSERT  INTO [DWDATA].[DBO].[IDxMAIL]
        ( [ID] ,
          [MAIL]
        )
        SELECT  DWDOCID ,
                MAIL
        FROM    dwdata.dbo.PERSONAL
                CROSS APPLY [DWDATA].[DBO].[SPLIT](REPLACE(CAST([BEMERKUNG] AS NVARCHAR(MAX)),
                                                           N'||', N','), ',')
        WHERE   [BEMERKUNG] IS NOT NULL
                AND [DWDOCID] NOT IN ( SELECT DISTINCT
                                                ( [ID] )
                                       FROM     [DWDATA].[DBO].[IDxMAIL]) 
   
   UPDATE   dwdata.dbo.IDxMail
   SET      MAIL = ( SELECT Mailnickname
                     FROM   dwrigths.dbo.Matchingtabelle
                     WHERE  Proxyadresse = dwdata.dbo.IDxMail.mail
                   )


Code:
CREATE FUNCTION [dbo].[Split]
    (
      @String NVARCHAR(4000) ,
      @Delimiter CHAR(1)
    )
RETURNS @Results TABLE
    (
      idx INT IDENTITY(1, 1)
              NOT NULL ,
      Mail NVARCHAR(4000)
    )
AS 
    BEGIN
        DECLARE @Index INT
        DECLARE @Slice NVARCHAR(4000)
        SELECT  @Index = 1
        IF @String IS NULL 
            RETURN
        WHILE @Index != 0 
            BEGIN
                SELECT  @Index = CHARINDEX(@Delimiter, @String)
                IF ( @Index != 0 ) 
                    SELECT  @Slice = LEFT(@String, @Index - 1)
                ELSE 
                    SELECT  @Slice = @String
                INSERT  INTO @Results
                        ( Mail )
                VALUES  ( @Slice )
                SELECT  @String = RIGHT(@String, LEN(@String) - @Index)
                IF LEN(@String) = 0 
                    BREAK
            END
        RETURN
    END

GO
 

Anhänge

  • Unbenannt.JPG
    Unbenannt.JPG
    36,6 KB · Aufrufe: 2
Hallo Yaslaw,

ist eine MSSQL 2008 DB.
Ich wollte ja gerade verhindern, dass pro Datensatz 2-fach in die IDxMail geschrieben wird.
Das sind immerhin 14 Mio. Datensätze / Jahr oder etwa 1/Sek.
 
Ich glaube auch MS SQL kennt Trigger. Und genau das ist das was du brauchst. Einen Trigger auf diene Insert-Tabelle
 
Macht ein AFTER INSERT TRIGGER nicht genau was der Name sagt, nämlich einen INSERT und dann noch einmal etwas (z.B. ein Update)? das ist mir eine Transaktion zu viel
 
Tja, du kannst auch ein BEFOR INSERT machen.
Ob du in einem INSERT ohne Trigger noch andere Tabellen bearbeiten kannst übersteigt mein nicht vorhandenes MS SQL-Wissen (hab noch nie mit MS SQL gearbeitet). Aber wenn es das zulässt würde ich mir Sorgen um die DB machen....
 
So geht es leider auch noch nicht, weil INSERTED in Zeile 17 nicht gebunden werden kann.

Code:
USE [dwdata]
GO

/****** Object:  Trigger [dbo].[InsteadTrigger]    Script Date: 09/06/2012 16:40:47 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TRIGGER [dbo].[InsteadTrigger] ON [dwdata].[dbo].[IDxMail]
    INSTEAD OF INSERT
AS
    BEGIN
        IF EXISTS ( SELECT  Mailnickname
                    FROM    dwrigths.dbo.Matchingtabelle
                    WHERE   Proxyadresse = INSERTED.mail ) 
            INSERT  INTO dbo.IDxMail
                    SELECT  id ,
                            ( SELECT    Mailnickname
                              FROM      dwrigths.dbo.Matchingtabelle
                              WHERE     Proxyadresse = INSERTED.mail
                            )
                    FROM    INSERTED
        ELSE 
            INSERT  INTO dbo.IDxMail
                    SELECT  id ,
                            mail
                    FROM    INSERTED
    END;
GO
 
Zuletzt bearbeitet:
Zurück