2017-05-16 6 views
1

Ich versuche, eine gespeicherte Prozedur von einem Trigger auszuführen, um sicherzustellen, dass Aufträge in der Reihenfolge gedruckt werden, in der sie in der Datenbank eingefügt wurden. Wenn ich die gespeicherte Prozedur manuell ausführe, wird sie in weniger als 20 Sekunden abgeschlossen. Wenn ich es vom Auslöser aus führe, wird es nie abgeschlossen.Gespeicherte Prozedur, die von Trigger aufgerufen wird, wird nicht ausgeführt

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

SET ARITHABORT OFF 
GO 
CREATE PROCEDURE [dbo].[usr_despatch_m2] @order VARCHAR(10) 
AS 

SET XACT_ABORT ON 
SET NOCOUNT ON 
--DROP TABLE #bundle (bundle int) 

DECLARE @sql VARCHAR(1000), @result INT, @text varchar(1000) 
SET @sql = 'D:\csserver\bin\runvtorddesp_m.bat '[email protected] 
-- set @sql = 'command.com /c sdespatch '+ @order 
EXEC @result = master..xp_cmdshell @sql, no_output 

IF @result in (0,1010) 
BEGIN 

EXEC manufg.dbo.op_populate_shipping_data_dev @order 

     IF @order LIKE '[T,Y,R,S]%' 
     BEGIN 
     EXEC [SERVER2].sp_manufg.[dbo].[pod_print_can_inv] @order 
     END 


SET @sql = 'command.com /c PRINT /D:\\SERVER1\MEM-SHIPPING-INVOICE \\SERVER1\e$\PODPDF\'+rtrim(@order)+'.PDF' 
EXEC @result = master..xp_cmdshell @sql, NO_OUTPUT 

END 

BEGIN 
SET @text = (SELECT 
CASE @result 
WHEN 0 THEN 'Order despatched successfully' 
WHEN 1010 THEN 'Order despatched successfully' 
WHEN 1 THEN 'Order error not found in order header' 
WHEN 2 THEN 'Order at incorrect status' 
WHEN 3 THEN 'Order despatch held' 
WHEN 4 THEN 'Order is not web order' 
WHEN 5 THEN 'Order not fully processed by DataLinx' 
WHEN 6 THEN 'Order is in error' 
WHEN 7 THEN 'Order is in error' 
WHEN 8 THEN 'Order header is locked' 
WHEN 9 THEN 'Stock item is locked' 
WHEN 13 THEN 'Order number not found' 
WHEN 33 THEN 'Unable to lock stock allocations (stallocm)' 
WHEN 34 THEN 'Unable to lock stock batch file (stquem)' 
WHEN 40 THEN 'Unable to update EIPOLASTDT system key' 
WHEN 50 THEN 'Unable to unlock EDI order' 
ELSE   'Order in error' 
END) 

SET @text = rtrim(@order) +' ' + @text 
SET @sql = 'echo ' + @text + ' > E:\DespatchErrors\Manufg\'+rtrim(@order)+'.txt' 
EXEC @result = master..xp_cmdshell @sql, no_output 

SET @sql = 'command.com /c PRINT /D:\\SERVER1\MEM-SHIPPING-INVOICE \\SERVER1\e$\DespatchErrors\MANUFG\'+rtrim(@order)+'.txt' 
EXEC @result = master..xp_cmdshell @sql, NO_OUTPUT 


END 

Der Trigger ist einfach

ALTER TRIGGER [dbo].[usr_order_despatch_m_c] on [dbo].[pod_mfg_inv] 

instead of insert 
as 
SET XACT_ABORT ON 
SET NOCOUNT ON 
DECLARE @order varchar(10) 
SET @order = (select order_no from inserted) 

EXEC usr_despatch_m2 'T568138' 

Das Verfahren gespeichert, die

GO 
SET QUOTED_IDENTIFIER ON 
SET XACT_ABORT ON 
SET ARITHABORT ON 
GO 
ALTER PROCEDURE [dbo].[pod_print_can_inv] 
    @myOrder CHAR(10) 
AS 

DECLARE 
    @mySql VARCHAR(1000), 
    @result INT 

BEGIN 
    --Select the right report since Trade invoices are different to Retail dispatch notes 
    IF @myOrder LIKE 'R%' 

     BEGIN 
      SET @mySql = 'dtsrun /S SERVER2 /E /N PODCanRetailInvPDF /A "myFilter":"8"="(lfdinv = ""' + RTRIM(@myOrder) + '"")"' 
     END 
    -- Canadian Battle For Vedros Invoices 
    IF @myOrder LIKE 'Y%' 
     BEGIN 
      SET @mySql = 'dtsrun /S SERVER2 /E /N PODVedrosInvoiceWithTerms /A "myFilter":"8"="(lfdinv = ""' + RTRIM(@myOrder) + '"")"' 
     END 
    -- Canadian Trade Invoices 
    ELSE 
     BEGIN 
      SET @mySql = 'dtsrun /S SERVER2 /E /N PODCanTradeInvWithTerms /A "myFilter":"8"="(lfdinv = ""' + RTRIM(@myOrder) + '"")"' 
     END 

    EXEC @result = master..xp_cmdshell @mySql, NO_OUTPUT 


    IF @result = 0 BEGIN 


     WAITFOR DELAY '00:00:01' 

     SET @mySql = 'DEL \\SERVER1\E$\PODPDF\TST\' + RTRIM(@myOrder) + '.pdf' 
     EXEC @result = master..xp_cmdshell @mySql, NO_OUTPUT 

     WAITFOR DELAY '00:00:01' 

     SET @mySql = 'REN \\SERVER1\E$\PODPDF\TST\PDFCreatorDocument.pdf ' + RTRIM(@myOrder) + '.pdf' 
     EXEC @result = master..xp_cmdshell @mySql, NO_OUTPUT 
     WAITFOR DELAY '00:00:01' 
    -- Stop MSAccess on the server 
     SET @mySql = 'PSKILL msaccess.exe' 
     EXEC master..xp_cmdshell @mySql, NO_OUTPUT 


     WAITFOR DELAY '00:00:10' 



     /* 
     IF @myOrder LIKE 'Y%' 
     BEGIN 
     SET @mySql = 'COMMAND AcroRd32.exe /t "\\SERVER1\E$\PODPDF\TST\' + RTRIM(@myOrder) + '.pdf" "\\SERVER1\BACKOFFICE" "Canon iR-ADV C5235/5240 PCL5c" "IP_172.16.235.100"' 
     EXEC master..xp_cmdshell @mySql, NO_OUTPUT 
     END*/ 

     SET @mySQL = 'MOVE \\SERVER1\E$\PODPDF\TST\'+RTRIM(@myOrder)+'.pdf \\SERVER1\E$\PODPDF' 
     EXEC @result = master..xp_cmdshell @mySQL, NO_OUTPUT 

     WAITFOR DELAY '00:00:05' 

    END 

END 

Das DTS-Paket auf dem Remote-Server und zum Erzeugen einer Access-Datenbank eröffnet wird bogging Dinge nach unten zu sein scheint eine Form. Dies funktioniert blitzschnell, wenn ich nur die gespeicherte Prozedur ausführe, aber wenn ich den Auslöser benutze, wird er nie abgeschlossen.

HILFE !!!

+2

Verwenden Sie wirklich noch SQL 2000 und DTS? –

+0

Ich wünschte, ich könnte nein sagen, aber das Unternehmen kann zu diesem Zeitpunkt nicht aktualisieren. –

+0

Sie können dies in einem Trigger nicht tun, da die Daten noch nicht festgeschrieben sind. In jeder unterstützten Version von SQL Server müssen Sie diese Befehle in eine andere Tabelle mit einem IDENTITY-Schlüssel schreiben, und eine Hintergrundaufgabe muss diese Tabelle der Reihe nach lesen und die Befehle ausführen. Ob das auch in SQL 2000 funktioniert kann ich nicht sagen :) –

Antwort

0

David Brown antwortete das für mich.

Sie können dies in einem Trigger nicht tun, da die Daten noch nicht festgeschrieben sind. In jeder unterstützten Version von SQL Server müssen Sie diese Befehle in eine andere Tabelle mit einem IDENTITY-Schlüssel schreiben, und eine Hintergrundaufgabe muss diese Tabelle der Reihe nach lesen und die Befehle ausführen. Ob das auch in SQL 2000 funktioniert kann ich nicht sagen :)

Verwandte Themen