【发布时间】:2017-06-01 13:30:37
【问题描述】:
这是一个简化的代码示例,它在接收到服务代理消息时执行 ssis 包,我需要等待所述包的完成才能走得更远。问题是:事务 TR_testSISOnMsg 没有提交,因为“while not exists”循环等待 ssis 完成,并且 ssis 执行在 SSISDB.catalog.executions 中保持“挂起”,因为它正在等待事务提交......所以我最终有两个进程等待对方完成......事务范围的微调不是我的强项......有什么想法吗?
CREATE PROCEDURE [dbo].[testSSISOnMsg]
AS
BEGIN
BEGIN TRANSACTION TR_testSSISOnMsg
WHILE(1=1)
BEGIN
DROP TABLE IF EXISTS testLog
CREATE TABLE testLog (IdLog UNIQUEIDENTIFIER,dateLog DATETIME,msgLog NVARCHAR(100))
DECLARE @conv_handle UNIQUEIDENTIFIER,
@msg_type sysname;
WAITFOR (
RECEIVE TOP (1)
@conv_handle = conversation_handle,
@msg_type = message_type_name
FROM [//SQL2016-DMDI/WorkspaceR/testSSIS/File_DemandeSSIS]
), TIMEOUT 1000;
IF (@@ROWCOUNT = 0)
BEGIN
ROLLBACK TRANSACTION TR_testSSISOnMsg;
BREAK;
END
IF @msg_type = N'//SQL2016-DMDI/WorkspaceR/testSSIS/MsgDemandeExec'
BEGIN
DECLARE @execution_id bigint,@status int;
DECLARE @package_name NVARCHAR(100) = N'testPackage.dtsx';
EXEC SSISDB.catalog.create_execution_VCH
@folder_name = N'DataScience',
@project_name = N'ScoresIndexation',
@package_name = @package_name,
@execution_id = @execution_id output;
EXEC SSISDB.catalog.start_execution_VCH @execution_id;
WHILE NOT EXISTS (SELECT 1 FROM SSISDB.catalog.executions where execution_id = @execution_id and end_time IS NOT NULL)
BEGIN
INSERT INTO testLog VALUES(NEWID(),GETDATE(),'waiting')
WAITFOR DELAY '00:00:30';
END
END
ELSE BEGIN
END CONVERSATION @conv_handle;
END
COMMIT TRANSACTION TR_testSSISOnMsg;
END
END
GO
【问题讨论】:
-
创建一个 SQL Server 代理作业并让接收到消息开始作业不是更简单吗?然后你可以在作业中创建单独的步骤,它会为你处理完成。
-
我有一个 SQL Server 代理来“cron”这一切,老实说,我在同一个过程中使用:Service Broker、SSIS 和 SQL Server R 服务......我是不确定在中间添加更多 SQL Server 代理作业会“更简单”:D
-
不添加作业添加步骤...
标签: sql-server tsql ssis transactions service-broker