将存储的数据用于查询 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的主要内容,如果未能解决你的问题,请参考以下文章