将存储的数据用于查询 SSIS

Posted

技术标签:

【中文标题】将存储的数据用于查询 SSIS【英文标题】:Use Stored data into query SSIS 【发布时间】:2018-03-08 01:00:06 【问题描述】:

我有一个获取数据的查询,因此我将其存储到 OLEDB Connection 中,因为我想将该数据多次用于另一个查询

查询

SELECT * FROM (
SELECT
TT.VOUCHER,
TT.TAXITEMGROUP,
TT.TAXCODE,
TT.SOURCEBASEAMOUNTCUR,
TT.SOURCETAXAMOUNTCUR,
TTGJAERIVA.TAXTRANSRELATIONSHIP,
TTGJAERIVA.GENERALJOURNALACCOUNTENTRY,
TTGJAERIVA.LEDGERDIMENSION,
GJAERIVA.TEXT,
GJAERIVA.LEDGERDIMENSION AS LEDGERDIMENSIONGAE,
GJAERIVA.POSTINGTYPE
FROM TAXTRANS TT 
INNER MERGE JOIN TAXTRANSGENERALJOURNALACCOUNTENTRY TTGJAERIVA ON TTGJAERIVA.TAXTRANS = TT.RECID
INNER MERGE JOIN GENERALJOURNALACCOUNTENTRY GJAERIVA ON TTGJAERIVA.GENERALJOURNALACCOUNTENTRY = GJAERIVA.RECID 
AND GJAERIVA.POSTINGTYPE IN( 14,236,71,41) 
AND TT.TRANSDATE <= '2015-04-30'
WHERE   
(TT.TAXORIGIN <> 11 AND TT.TRANSDATE BETWEEN  '2015-01-01' AND  '2015-04-30') OR (TT.TAXORIGIN = 11 AND TT.TRANSDATE BETWEEN '2015-01-01' AND  '2015-04-30' )) AS T

然后我创建另一个 OLEDB 连接,在那里我有另一个查询,我使用来自第一个查询的数据

第二次查询(仅相关代码)

LEFT MERGE JOIN 
(SELECT TTRIVA.*,TTGJAERIVA.GENERALJOURNALACCOUNTENTRY FROM TAXTRANS TTRIVA 
INNER MERGE JOIN TAXTRANSGENERALJOURNALACCOUNTENTRY TTGJAERIVA ON TTGJAERIVA.TAXTRANS = TTRIVA.RECID
INNER MERGE JOIN GENERALJOURNALACCOUNTENTRY GJAERIVA ON TTGJAERIVA.GENERALJOURNALACCOUNTENTRY = GJAERIVA.RECID 
AND GJAERIVA.POSTINGTYPE IN( 14,236,71) AND TTRIVA.TRANSDATE <=@FECHA) TTRIVA ON TT.VOUCHER = TTRIVA.VOUCHER 
AND TT.SOURCERECID = TTRIVA.SOURCERECID 
AND TT.TAXITEMGROUP = TTRIVA.TAXITEMGROUP 
AND (TTRIVA.TAXCODE LIKE 'RIVA%')
AND TTRIVA.GENERALJOURNALACCOUNTENTRY = TTGJAE.GENERALJOURNALACCOUNTENTRY


--JOIN PARA RETENCIONES DE ISR PAGADAS
LEFT MERGE JOIN 
(SELECT TTRISR.*,TTGJAERIVA.GENERALJOURNALACCOUNTENTRY FROM TAXTRANS TTRISR
INNER MERGE JOIN TAXTRANSGENERALJOURNALACCOUNTENTRY TTGJAERIVA ON TTGJAERIVA.TAXTRANS = TTRISR.RECID
INNER MERGE JOIN GENERALJOURNALACCOUNTENTRY GJAERIVA ON TTGJAERIVA.GENERALJOURNALACCOUNTENTRY = GJAERIVA.RECID 
AND GJAERIVA.POSTINGTYPE IN( 14,236,71) AND TTRISR.TRANSDATE <=@FECHA) TTRISR ON TT.VOUCHER = TTRISR.VOUCHER AND TT.SOURCERECID = TTRISR.SOURCERECID 
AND TT.TAXITEMGROUP = TTRISR.TAXITEMGROUP 
AND (TTRISR.TAXCODE LIKE 'RISR%')
AND TTRISR.GENERALJOURNALACCOUNTENTRY = TTGJAE.GENERALJOURNALACCOUNTENTRY

--JOIN PARA IEPSCUOTA
LEFT MERGE JOIN 
(SELECT TTIEPSCUOTA.*,TTGJAERIVA.GENERALJOURNALACCOUNTENTRY FROM TAXTRANS TTIEPSCUOTA
INNER MERGE JOIN TAXTRANSGENERALJOURNALACCOUNTENTRY TTGJAERIVA ON TTGJAERIVA.TAXTRANS = TTIEPSCUOTA.RECID
INNER MERGE JOIN GENERALJOURNALACCOUNTENTRY GJAERIVA ON TTGJAERIVA.GENERALJOURNALACCOUNTENTRY = GJAERIVA.RECID 
AND GJAERIVA.POSTINGTYPE IN( 14,236,71) AND TTIEPSCUOTA.TRANSDATE <=@FECHA) TTIEPSCUOTA ON TT.VOUCHER = TTIEPSCUOTA.VOUCHER AND TT.SOURCERECID = TTIEPSCUOTA.SOURCERECID 
AND TT.TAXITEMGROUP = TTIEPSCUOTA.TAXITEMGROUP 
AND (TTIEPSCUOTA.TAXCODE LIKE 'IEPSCUOTAP') 
AND TTIEPSCUOTA.GENERALJOURNALACCOUNTENTRY = TTGJAE.GENERALJOURNALACCOUNTENTRY

如您所见,我在每个LEFT JOIN 中都使用了FROM TAXTRANS,但我将TAXTRANS 存储在第一个查询中。如何用第一个查询数据替换第二个查询?

数据流:

【问题讨论】:

【参考方案1】:

如果可以在单个集合中完成查询并合并查询,有什么需要?如果您仍然希望在单独的批处理基础上进行查询,我建议首先将您想要重复使用的查询插入到临时表(#表)中。使用该临时表左连接您的其他查询。将其全部封装在存储过程中,然后获取数据。要进一步提高性能,请检查是否可以合并索引。

带有排序的合并连接是一种非常昂贵的转换,它会影响性能。此外,您正在寻求的是 T-SQL 改进,而 SSIS 转换不能替代它

【讨论】:

我这样做是因为第二个查询不是我唯一的查询,我应该做另一个查询,例如 10,并且所有查询都使用 TAXTRANS 信息 如果您需要运行的所有其他 10 个查询都在同一个数据库中,那么我上面列出的内容仍然适用。逐步模块化您的查询,并使其在数据库本身作为一批语句运行。通过 Merge 将连接逻辑引入 SSIS 将无济于事。 将您的查询分成可重用的部分并将它们分配给变量。在执行 sql 任务之前,在表达式任务中构建每个语句。

以上是关于将存储的数据用于查询 SSIS的主要内容,如果未能解决你的问题,请参考以下文章

SSIS 错误:[执行 SQL 任务] 错误:执行查询

SSIS 执行 SQL 查询任务找不到存储过程

SSIS - 如何将电源查询的输出导入数据流中的另一个电源查询

我将如何在 SSIS 数据流中实现此查询?

为啥 SSIS 变量没有将毫秒部分传递给查询?

由于 174 个 UNION ALL 语句,SQL Server 查询 SSIS 转换超时