基于发票行项目检查的 SSIS SQL 拆分文件

Posted

技术标签:

【中文标题】基于发票行项目检查的 SSIS SQL 拆分文件【英文标题】:SSIS SQL Splitting files based on Invoice Line item check 【发布时间】:2020-01-11 07:33:41 【问题描述】:

我有一个包含以下详细信息的 SQL 表。发票 ID 及其各自的详细信息。每个发票可以有单行或多行。

我的要求是我需要拆分多个 CSV 文件。我可以使用 SSIS 轻松做到这一点。

但是假设一张发票有 4 行,那么它应该被捕获在单个文件中。不是一个文件中的 2 行,另一个文件中的另外两行。这必须在 SSIS 中导出时处理

例如,给定的数据有 20 条记录,因此如果我将每个记录拆分为 10 条记录,那么将提取 2 个文件。但是,如果您在第 8 行中看到发票 105 有 4 行。因此它应该移动到第二个文件。第一个文件将有直到发票 104 达到 8 行(这很好)。这对我来说似乎是一项非常棘手的任务。对于如何实现这一点,我将不胜感激。

【问题讨论】:

那么你为什么要拆分文件?为什么不能将所有内容都写入一个文件?回答这个问题将有助于我们提出解决方案。 嗨尼克,因为这是要求。我这里只是举了一个例子。表中有数百万条记录。因此分裂。 实际参数是多少? 2个文件? 20个文件?每个标题 1 个文件? 如果您对不同范围的发票 ID 运行选择,您将始终获得完整的发票。但是每个文件有多少张发票?或多少个文件?或多少行?我们不知道您为什么需要拆分或要拆分成多少。 例如您可以使用select MAX(InvoiceID) / 2 from YourTable 计算出一个数据范围,然后将记录导出到两个文件,但是您想要两个文件吗?四个文件?你需要澄清一下。 【参考方案1】:

这是一个很好的问题,这可能是来自客户端或我们亲爱的经理的要求。 我有一个解决方案 -

Sql查询你自己我给出的逻辑。

1-Foreachloop将在该表中没有记录时停止

Declare @cnt int Set @cnt=(Select count(*) from your_table) IF @cnt>0

2-首先通过Invoice Id and count 函数组通过Invoice Id 使用Row_Number() 函数划分记录strong> 其中 count 大于或等于 4 并使用 Execute SQL Task 插入到临时表中。

3-根据 Row_Number() 查找记录,将其分配给一个变量,然后从表中删除这些记录,仅Execute SQL Task 作为完整结果集。下一次迭代,这些记录将不存在。

4-从带有时间戳的变量中将数据插入 Excel 工作表。

5-在下一次迭代中,它将根据 Row_Number 选择具有 4 条或多于 4 条记录的下一个 Invoice Id

6-此循环的输出端我们将所有 Invoice Id 记录超过 4 条并插入带有时间戳的 Excel 工作表。

我创建了类似的项目,其中客户想要的数据应该根据城市进行分叉,这与那个类似,目前我的机器上没有安装 SQL Server 和 Visual Studio 数据工具,否则无法给你确切的信息组件,请尝试逻辑,一旦您有任何问题,请告诉我。

【讨论】:

我投了反对票,因为; 1、需要删除记录; 2.它使用循环; 3. 在该循环内,它运行缓慢select count(*)。 (我想?)然后你有另一个“扫地”操作。 真诚地,我要感谢 Nick.McDermaid 说实话,Nick 我将在循环内完成所有任务,这就是我在第一点提到它的原因,是的,删除记录是需要这就是为什么我在第 3 点提到它。我已经完成了这种包,目前在我的机床上不可用,否则我会向你展示一个演示......我不是要求投票,但如果有人投反对票,然后如果他们提到他们为什么投反对票,这将对所有这一切都有帮助,这就是我那天问的原因......谢谢【参考方案2】:

您可以使用 CTE 的组合:

这将为您提供前半部分,而无需在文件之间拆分发票。使用 >= 得到另一半。

;with AddRN as (
select rn = row_number() over (order by InvoiceID,[Line ID])
    ,*
from table
)
, HalfOfRN as (
select half = max(rn) / 2 from AddRN
)
,MiddleInv as (
select InvoiceID from AddRN where rn=(select half from HalfOfRN))

select *
from table 
where InvoiceID< (Select InvoiceID from MiddleInv) 

【讨论】:

以上是关于基于发票行项目检查的 SSIS SQL 拆分文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在SSIS中将大型Excel文件拆分为多个小文件?

带有生成Excel文件脚本的SSIS项目在vs中可以执行成功,但部署到sql server中执行就报错调用目标发生异常

使用 SSIS 包将一个字段中的值拆分为两个值,以便在 SQL Server 中的两个不同字段中使用

002 MIRO发票校验采购订单项目科目分配类别检查增强-20150819

在 SSIS 执行 SQL 任务中捕获错误行

SSIS中对多个工作表的条件拆分转换