2010-09-22 25 views
14

Tôi có một thủ tục lưu trữ tên insert2Newsletter với các thông sốGọi Stored Procedure trong Tạo trigger trong SQL Server

(@sex nvarchar(10), 
@f_name nvarchar(50), 
@l_name nvarchar(70), 
@email nvarchar(75), 
@ip_address nvarchar(50), 
@hotelID int, 
@maArt nchar(2)) 

Tôi muốn gọi thủ tục lưu trữ này trong một kích hoạt chèn. Làm cách nào để truy xuất các trường tương ứng được chèn vào và làm thế nào để tôi gọi insert2Newsletter trong trình kích hoạt?

tôi đã cố gắng nhưng không thành công:

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE TRIGGER RA2Newsletter 
    ON [dbo].[Reiseagent] 
    AFTER INSERT 
AS 
DECLARE @rAgent_Name nvarchar(50), 
DECLARE @rAgent_Email nvarchar(50), 
DECLARE @rAgent_IP nvarchar(50), 
DECLARE @hotelID int 

BEGIN 
    SET NOCOUNT ON; 

    -- Insert statements for trigger here 
    Select @rAgent_Name=rAgent_Name, @rAgent_Email=rAgent_Email, @rAgent_IP=rAgent_IP, @hotelID=hotelID From Inserted 
    EXEC insert2Newsletter '','',@rAgent_Name,@rAgent_Email,rAgent_IP,@hotelID,'RA' 


END 
GO 

thx rất nhiều phản hồi của bạn ... chúc mừng ...

Trả lời

9

cuối cùng ...

set ANSI_NULLS ON 
set QUOTED_IDENTIFIER ON 

GO 
ALTER TRIGGER [dbo].[RA2Newsletter] 
    ON [dbo].[Reiseagent] 
    AFTER INSERT 
AS 
    declare 
    @rAgent_Name nvarchar(50), 
    @rAgent_Email nvarchar(50), 
    @rAgent_IP nvarchar(50), 
    @hotelID int, 
    @retval int 


BEGIN 
    SET NOCOUNT ON; 

    -- Insert statements for trigger here 
    Select @rAgent_Name=rAgent_Name,@rAgent_Email=rAgent_Email,@rAgent_IP=rAgent_IP,@hotelID=hotelID From Inserted 
    EXEC insert2Newsletter '','',@rAgent_Name,@rAgent_Email,@rAgent_IP,@hotelID,'RA', @retval 

END 
+2

Điều gì sẽ xảy ra nếu bạn đang chèn nhiều bản ghi? Điều này sẽ phá vỡ. – starskythehutch

0

Bạn vượt qua một tham số rAgent_IP không xác định trong EXEC thay vì @rAgent_IP biến cục bộ.

Tuy nhiên, trình kích hoạt này sẽ thất bại nếu bạn thực hiện câu lệnh INSERT nhiều bản ghi.

+0

tôi điều chỉnh @rAgent_IP. Tuy nhiên nó không hoạt động. Một INSERT nhiều bản ghi sẽ không được – user168507

6

Tôi nghĩ rằng bạn sẽ phải lặp trên bảng "chèn", trong đó có tất cả các hàng đã được cập nhật. Bạn có thể sử dụng vòng lặp WHERE hoặc câu lệnh WITH nếu khóa chính của bạn là GUID. Đây là đơn giản hơn (đối với tôi) để viết, vì vậy đây là ví dụ của tôi. Chúng tôi sử dụng phương pháp này, vì vậy tôi biết thực tế nó hoạt động tốt.

ALTER TRIGGER [dbo].[RA2Newsletter] ON [dbo].[Reiseagent] 
    AFTER INSERT 
AS 
     -- This is your primary key. I assume INT, but initialize 
     -- to minimum value for the type you are using. 
     DECLARE @rAgent_ID INT = 0 

     -- Looping variable. 
     DECLARE @i INT = 0 

     -- Count of rows affected for looping over 
     DECLARE @count INT 

     -- These are your old variables. 
     DECLARE @rAgent_Name NVARCHAR(50) 
     DECLARE @rAgent_Email NVARCHAR(50) 
     DECLARE @rAgent_IP NVARCHAR(50) 
     DECLARE @hotelID INT 
     DECLARE @retval INT 

    BEGIN 
     SET NOCOUNT ON ; 

     -- Get count of affected rows 
     SELECT @Count = Count(rAgent_ID) 
     FROM inserted 

     -- Loop over rows affected 
     WHILE @i < @count 
      BEGIN 
       -- Get the next rAgent_ID 
       SELECT TOP 1 
         @rAgent_ID = rAgent_ID 
       FROM inserted 
       WHERE rAgent_ID > @rAgent_ID 
       ORDER BY rAgent_ID ASC 

       -- Populate values for the current row 
       SELECT @rAgent_Name = rAgent_Name, 
         @rAgent_Email = rAgent_Email, 
         @rAgent_IP = rAgent_IP, 
         @hotelID = hotelID 
       FROM Inserted 
       WHERE rAgent_ID = @rAgent_ID 

       -- Run your stored procedure 
       EXEC insert2Newsletter '', '', @rAgent_Name, @rAgent_Email, 
        @rAgent_IP, @hotelID, 'RA', @retval 

       -- Set up next iteration 
       SET @i = @i + 1 
      END 
    END 
GO 

Tôi chắc chắn hy vọng điều này sẽ giúp bạn. Chúc mừng!

+1

Lưu ý rằng để làm việc này, bạn cần thay đổi 'WHILE @i <@ count' thành' WHILE @i <= @ count' hoặc thay đổi khởi tạo để tạo 'i int = 0' hoặc nó sẽ không thực sự làm việc cho một trong các mục, tôi hy vọng bạn không sử dụng phương pháp này cho tất cả các trình kích hoạt của bạn ;-) – enderland

+0

@enderland - Bạn là chính xác. Tôi đã cập nhật mã ví dụ. Cảm ơn vì đã bắt được điều đó! –

1

Sau đây nên làm các trick - Chỉ SQLServer


Alter TRIGGER Catagory_Master_Date_update ON Catagory_Master AFTER delete,Update 
AS 
BEGIN 

SET NOCOUNT ON; 

Declare @id int 
DECLARE @cDate as DateTime 
    set @cDate =(select Getdate()) 

select @id=deleted.Catagory_id from deleted 
print @cDate 

execute dbo.psp_Update_Category @id 

END 

Alter PROCEDURE dbo.psp_Update_Category 
@id int 
AS 
BEGIN 

DECLARE @cDate as DateTime 
    set @cDate =(select Getdate()) 
    --Update Catagory_Master Set Modify_date=''[email protected]+'' Where [email protected] [email protected] 
    Insert into Catagory_Master (Catagory_id,Catagory_Name) values(12,'Testing11') 
END 

Các vấn đề liên quan