我在 https://stackoverflow.com/a/34868545/181965 上介绍了这种模式,但您正在寻找一个看起来像这样的包
一个序列容器,其中包含这 8 个离散工作桶之一所需的所有内容。在你的情况下,一个变量为
- 当前包字符串
- rsObject 对象
- ContainerId Int32
containerId 将是 0 到 7 之间的值(因为您有 8 个工作桶)。如另一个答案中所述,我们必须将变量范围限定为序列容器。 2012+ 的默认设置是在控制流级别创建它们,而 2005/2008 将在选定对象的级别创建它们。
设置
我创建了一个表并加载了 200 行
CREATE TABLE dbo.so_35415549
(
id int IDENTITY(1,1) NOT NULL
, PackageName sysname
);
INSERT INTO
dbo.so_35415549
(
PackageName
)
SELECT TOP 200
'Package' + CAST(ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS varchar(3))
FROM
sys.all_columns AS AC;
获取我的存储桶的数据
模数,模数,模数,无论你怎么称呼它运算符都是我们这里的朋友。 mod 运算符将返回除法后的余数。 例如 10 mod 3 是 1 因为 3*3 + 1 = 10
在您的情况下,您将通过 8 修改,因此您知道余数将在 0 和 7 之间。
SQL Server 将 mod 运算符实现为%,您可以通过以下查询测试其正确性
SELECT
S.id
, S.PackageName
, S.id % 8 AS ModValue
FROM
dbo.so_35415549 AS S
ORDER BY
1;
样本输出
id PackageName ModValue
1 Package1 1
2 Package2 2
3 Package3 3
4 Package4 4
5 Package5 5
6 Package6 6
7 Package7 7
8 Package8 0
9 Package9 1
10 Package10 2
...
199 Package199 7
200 Package200 0
SQL 获取工作列表
使用上面的查询作为模板,我们将使用下面的查询。注意那里的?。这是 OLE DB 连接管理器的执行 SQL 任务参数化的占位符。
SELECT
S.PackageName
FROM
dbo.so_35415549 AS S
WHERE
S.id % 8 = ?
ORDER BY
1;
我们传入的参数是@[User::ContainerId]
结果集选项将从无更新为完整结果集,我们将值推送到rsObject
FELC 粉碎工作清单
这是一个标准的shredding of a recordset。我们在上一步中填充了变量,所以让我们枚举结果。我们的结果集中将有一列,您将其映射到 User::CurrentPackageName
EPT 运行包
这是您的执行包任务。使用 CurrentPackageName 的值就可以了。