我有一个难题,我很难过,希望你们都能帮忙。
以下是我的方案:我通过Web界面将数据加载到我们的数据库中。首先,我将文件上传到SQL框,然后我调用脚本,该脚本将数据提取并加载到SQL中。
我最近改变了这个过程,现在,我不是从Web应用程序中执行包,而是调用存储过程来执行脚本。
以下是我的代码的核心:
CREATE PROCEDURE [dbo].[ExecuteSsisPackage]
@Package NVARCHAR(100),
AS
BEGIN
SET NOCOUNT ON;
DECLARE @executionID BIGINT
EXEC SSISDB.catalog.create_execution
@folder_name = 'Imports', -- nvarchar(128)
@project_name = 'DataImports, -- nvarchar(128)
@package_name = @Package, -- nvarchar(260)
@use32bitruntime = 1, -- bit
@execution_id = @executionID OUTPUT -- bigint
SELECT @executionId
EXEC [SSISDB].[catalog].[set_execution_parameter_value] @executionId, 50, N'SYNCHRONIZED', @parameter_value = 1 -- turn on synchronization
EXEC ssisdb.catalog.start_execution @executionID;
RETURN (@executionID)
END
这是奇怪的部分:当我从管理工作室运行存储过程时,它执行正常。但是,当我从Web应用程序执行此操作时,它会超时。但是,如果我关闭同步它通过Web应用程序执行得很好。禁用同步的问题是我需要在加载数据后从数据中提取一些摘要信息。
我甚至尝试从我发现的帖子中滚动自己的“同步”:
DECLARE @status AS BIGINT = 1;
WHILE(@status = 1 OR @status = 2 OR @status = 5 OR @status= 8)
BEGIN
PRINT 'Status: ' + CAST(@status AS VARCHAR(10))
PRINT 'waiting 2 seconds for Package to finish'
WAITFOR DELAY '00:00:2';
SET @status = (SELECT [Status] FROM SSISDB.[catalog].[executions]
WHERE execution_id = @executionID);
END
PRINT 'Exit Status: ' + CAST(@status AS VARCHAR(10))
这也超时了。我做了一些挖掘,发现当SP从Web(但不是管理工作室)执行时,有一个锁:LCK_M_S和wait_resource是:KEY:9:72057594041532416(d28bcaafb8df)。同样,这仅在从Web应用程序执行SP时发生。
更多的挖掘出土了锁的罪魁祸首。它是SSISDB.internal.operations表的PK_Operations键。这是一个难题。任何想法为什么只能通过网络发生这种情况并且当它同步时才开启?