INSERT TRIGGER durch Stored Proc oder Access-Query

04/11/2009 - 23:08 von Gavin Porter | Report spam
Hallo Gemeinde,

portiere gerade etwas Logik von einer Access DB auf den SQL Server
(2000). An einer Server-Tabelle hàngt ein Insert Trigger, s.u.
Wenn der Trigger durch eine Anfügeabfrage aus Access ausgelöst wird,
funzt es fehlerlos. Wenn der Trigger durch ein Insert Statement aus
einer Stored Proc. ausgelöst wird, knallt's, weil das Inserted-Recordset
mehrere Werte enthàlt und nicht einer Variablen zugewiesen werden kann,
kann man verstehen. Wieso funtkioniert das aber bei einer Anfügeabfrage
aus dem Frontend heraus ohne Fehler. Und wie könnte man das umbauen,
damit die Variable jeweils für jeden Datensatz stimmt.

Besten Dank im Voraus für 'ne Hilfestellung.

Gavin

***********************************************************************

CREATE TRIGGER tri_4600_3900_ins ON [dbo].[tbl_4600]
FOR INSERT, UPDATE
AS

DECLARE @ID int
SET @ID = (SELECT inserted.[ID] FROM inserted)

UPDATE [tbl_3000] SET [Containeranzahl] = dbo.fctContDescr(@ID) WHERE
tbl_3000.[ID] = @ID

DECLARE @getQuantity float

IF (SELECT COUNT(*) FROM tbl_3900 WHERE [lng_3900_ID] = @ID) = 1
BEGIN
SET @getQuantity = (SELECT ISNULL( (SELECT [dblAnzahl] FROM
tbl_4600 WHERE [ID] = @ID AND [lngContID] = 1),0))
UPDATE [tbl_3900] SET [int_3900_C20] = @getQuantity WHERE
[lng_3900_ID] = @ID
SET @getQuantity = (SELECT ISNULL( (SELECT [dblAnzahl] FROM
tbl_4600 WHERE [ID] = @ID AND [lngContID] = 2),0))
UPDATE [tbl_3900] SET [int_3900_C40] = @getQuantity WHERE
[lng_3900_ID] = @ID
SET @getQuantity = (SELECT ISNULL( (SELECT [dblAnzahl] FROM
tbl_4600 WHERE [ID] = @ID AND [lngContID] = 3),0))
UPDATE [tbl_3900] SET [int_3900_C40HC] = @getQuantity WHERE
[lng_3900_ID] = @ID
SET @getQuantity = (SELECT ISNULL( (SELECT [dblAnzahl] FROM
tbl_4600 WHERE [ID] = @ID AND [lngContID] = 10),0))
UPDATE [tbl_3900] SET [int_3900_C20S] = @getQuantity WHERE
[lng_3900_ID] = @ID
SET @getQuantity = (SELECT ISNULL( (SELECT [dblAnzahl] FROM
tbl_4600 WHERE [ID] = @ID AND [lngContID] = 4),0))
UPDATE [tbl_3900] SET [dbl_3900_LCLVolume] = @getQuantity WHERE
[lng_3900_ID] = @ID
IF @getQuantity > 0
UPDATE [tbl_3900] SET [bln_3900_LCLYesNo] = 1 WHERE
[lng_3900_ID] = @ID
ELSE
UPDATE [tbl_3900] SET [bln_3900_LCLYesNo] = 0 WHERE
[lng_3900_ID] = @ID
SET @getQuantity = (SELECT ISNULL( (SELECT [dblWeightLCL] FROM
tbl_4600 WHERE [ID] = @ID AND [lngContID] = 4),0))
UPDATE [tbl_3900] SET [dbl_3900_LCLWeight] = @getQuantity WHERE
[lng_3900_ID] = @ID
END
 

Lesen sie die antworten

#1 Josef Poetzl
04/11/2009 - 23:21 | Warnen spam
Hallo!

Gavin Porter schrieb:
portiere gerade etwas Logik von einer Access DB auf den SQL Server
(2000). An einer Server-Tabelle hàngt ein Insert Trigger, s.u.
Wenn der Trigger durch eine Anfügeabfrage aus Access ausgelöst wird,
funzt es fehlerlos. Wenn der Trigger durch ein Insert Statement aus
einer Stored Proc. ausgelöst wird, knallt's, weil das Inserted-Recordset
mehrere Werte enthàlt und nicht einer Variablen zugewiesen werden kann,
kann man verstehen. Wieso funtkioniert das aber bei einer Anfügeabfrage
aus dem Frontend heraus ohne Fehler.



Eventuell werden aus dem FE nur einzelne DS an den Server übertragen.
Schau dir das einmal mit dem Profiler an.

Und wie könnte man das umbauen,
damit die Variable jeweils für jeden Datensatz stimmt.



Notfalls mit einem Cursor, den man aber in den meisten Fàllen umgehen
kann.

CREATE TRIGGER tri_4600_3900_ins ON [dbo].[tbl_4600]
FOR INSERT, UPDATE
AS

DECLARE @ID int
SET @ID = (SELECT inserted.[ID] FROM inserted)

UPDATE [tbl_3000] SET [Containeranzahl] = dbo.fctContDescr(@ID) WHERE
tbl_3000.[ID] = @ID



Kannst du nicht auf @ID verzichten und nur eine Update-Anweisung
starten?

UPDATE X SET
X.Containeranzahl = dbo.fctContDescr(X.ID)
FROM
tbl_3000 X
INNER JOIN
inserted I
On I.ID = X.ID

Für den Rest findest du vielleicht auch eine Möglichkeit um alle DS
aus inserted in einem Zug zu überarbeiten.


mfg
Josef

Ähnliche fragen