首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >运行SSIS包,但包路径将在运行时确定

运行SSIS包,但包路径将在运行时确定
EN

Database Administration用户
提问于 2023-02-06 10:30:42
回答 1查看 79关注 0票数 0

我必须通过代理将16个Excel文件导入到16个表中。代理将进一步处理数据。我已经为每个人创建了一个SSIS包。我不想为了做同样的事情而创造16个工作岗位。我的想法:

  1. 将SSIS包传递给作业(在过程中循环路径并调用作业)
  2. 一旦数据被导入,成功/失败:不同的步骤将被处理。
  3. 一旦成功,下一个包将被处理(步骤1)

这不需要大容量插入就能完成吗?

EN

回答 1

Database Administration用户

发布于 2023-02-06 16:16:17

不能将参数传递给SQL代理作业,必须重新处理第一项。

您可以做的一种方法是创建一个自定义表,该表保存到ssis包的路径,然后代理作业通过它枚举并调用各种命令来启动SSIS包。

代码语言:javascript
运行
复制
CREATE TABLE ETL.PackageControl
(
    PackageControlSK int identity(1,1) NOT NULL PRIMARY KEY
,   ExecutionOrder int NOT NULL
,   PackagePath varchar(255) NOT NULL
);
-- Sample data
INSERT INTO ETL.PackageControl
SELECT * 
FROM
(
    VALUES
        (10, '\ssisdb\folder\project\package.dtsx')
    ,   (20, '\ssisdb\folder\project\package2.dtsx') 
    ,   (30, '\ssisdb\folder\project\package3.dtsx') 
)D(ExecutionOrder, PackagePath)
WHERE NOT EXISTS (SELECT * FROM ETL.PackageControl AS PC WHERE PC.PackagePath = D.PackagePath);

SSIS

假设您正在使用项目部署模型,则包运行是几个存储过程调用串在一起的

  • create_execution创建一个执行实例
  • set_execution_parameter_value允许您为该执行的实例配置值。
  • start_execution开始实际运行包

默认情况下,ssis包将在异步模式下运行,因此您需要设置同步位。

下面的TSQL演示如何通过运行SSIS包的PackageControl表枚举。

请注意您的待办事项,虽然语法在我的思维解析器中看起来很正确,但实际代码可能略有偏离。

代码语言:javascript
运行
复制
DECLARE @PackagePath varchar(255)
,   @ExecutionOrder int
,   @execution_id bigint
-- Your TODO will be parsing this data out of PackagePath
-- Or change the definition of PackageControl to hold the individual parts
-- whatever makes sense for your environment
,   @folder_name nvarchar(128) = 'folder'
,   @project_name nvarchar(128) = 'project'
,   @package_name nvarchar(128)

DECLARE CSR CURSOR 
FAST_FORWARD FOR
SELECT
    PC.PackagePath, PC.ExecutionOrder
FROM
    ETL.PackageControl AS PC
ORDER BY
    PC.ExecutionOrder ASC;

OPEN CSR;
FETCH NEXT FROM CSR INTO @PackagePath, @ExecutionOrder;
WHILE @@FETCH_STATUS = 0
BEGIN
    -- Lazy assumption here on how we can identify the package that is needed to be run. The trailing slash might be esacaping the single quote, handle appropriately
    SET @package_name = REPLACE(@packagePath, '\ssisdb\folder\project\', '');

    EXECUTE SSISDB.catalog.create_execution
        @package_name=@package_name
    ,   @folder_name=@folder_name
    ,   @project_name=@project_name
    -- TODO: Which runtime do you need to use?
    ,   @use32bitruntime=False
    ,   @execution_id=@execution_id OUTPUT;

    DECLARE @var0 smallint = 1;    
    EXEC [SSISDB].[catalog].[set_execution_parameter_value]
        @execution_id
    ,   @object_type=50
    ,   @parameter_name=N'LOGGING_LEVEL'
    ,   @parameter_value=@var0;

    EXEC [SSISDB].[catalog].[start_execution] @execution_id;

FETCH NEXT FROM CSR INTO @PackagePath, @ExecutionOrder;
END
CLOSE CSR;
DEALLOCATE CSR;

文档/学习

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/323110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档