我必须通过代理将16个Excel文件导入到16个表中。代理将进一步处理数据。我已经为每个人创建了一个SSIS包。我不想为了做同样的事情而创造16个工作岗位。我的想法:
这不需要大容量插入就能完成吗?
发布于 2023-02-06 16:16:17
不能将参数传递给SQL代理作业,必须重新处理第一项。
您可以做的一种方法是创建一个自定义表,该表保存到ssis包的路径,然后代理作业通过它枚举并调用各种命令来启动SSIS包。
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包将在异步模式下运行,因此您需要设置同步位。
下面的TSQL演示如何通过运行SSIS包的PackageControl表枚举。
请注意您的待办事项,虽然语法在我的思维解析器中看起来很正确,但实际代码可能略有偏离。
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;
https://dba.stackexchange.com/questions/323110
复制相似问题