2010-09-22 13 views
14

में ट्रिगर बनाएं मैं मापदंडोंकॉल संग्रहीत प्रक्रिया के भीतर एसक्यूएल सर्वर

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

मैं एक डालने ट्रिगर में इस संग्रहीत प्रक्रिया फोन चाहते हैं के साथ insert2Newsletter नाम के एक संग्रहीत प्रक्रिया है। मैं सम्मिलित से संबंधित फ़ील्ड को कैसे पुनर्प्राप्त करूं और ट्रिगर के भीतर मैं insert2 न्यूजलेटर कैसे कॉल करूं?

मैं सफलता के बिना की कोशिश की:

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 आपकी प्रतिक्रिया ... बधाई के लिए बहुत कुछ ...

उत्तर

9

अंत में ...

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

नहीं होगा यदि आप एकाधिक रिकॉर्ड डाल रहे हैं तो क्या होता है? यह टूट जाएगा। – starskythehutch

0

आप स्थानीय चर @rAgent_IP के बजाय EXEC में एक अपरिभाषित rAgent_IP पैरामीटर गुजरती हैं।

फिर भी, यदि आप एक बहु-रिकॉर्ड INSERT कथन करते हैं तो यह ट्रिगर विफल हो जाएगा।

+0

मैं @rAgent_IP समायोजित। फिर भी यह काम नहीं करता है। एक बहु-रिकॉर्ड INSERT – user168507

6

मुझे लगता है कि आप "डाला" तालिका, जो सभी पंक्तियां अपडेट किए गए थे शामिल अधिक लूप करना होगा। यदि आपकी प्राथमिक कुंजी एक GUID है तो आप WHERE लूप या एक कथन का उपयोग कर सकते हैं। यह लिखना आसान है (मेरे लिए), तो मेरा उदाहरण यहां है। हम इस दृष्टिकोण का उपयोग करते हैं, इसलिए मुझे पता है कि यह ठीक काम करता है।

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 

मुझे यकीन है कि यह आपकी मदद करता है। चीयर्स!

+1

इस काम के लिए नोट करें आपको 'WHILE @i <@ count'' को 'WHILE @i <= @ count'' बदलने के लिए या 'i int = 0' बनाने के लिए प्रारंभिक परिवर्तन को बदलने की आवश्यकता है या यह वास्तव में किसी एक के लिए काम नहीं करेगा प्रविष्टियां, मुझे आशा है कि आप अपने सभी ट्रिगर्स के लिए इस दृष्टिकोण का उपयोग नहीं कर रहे हैं ;-) – enderland

+0

@ निडरलैंड - आप सही हैं। मैंने उदाहरण कोड अपडेट किया है। इसे पकड़ने के लिए धन्यवाद! –

1

निम्नलिखित चाल करना चाहिए - केवल 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 

संबंधित मुद्दे