在SSIS ETL中,我有一个查询,我需要在服务器/ db上运行,不允许我们创建存储过程。
我通常会将变量中的存储过程用作OLE DB源的源:
但是,由于我们无法将存储过程放在此服务器上,因此我打算通过执行SQL语句将存储过程的代码存储到变量中,从我们的home数据库中检索文本,然后使用存储在此变量中的文本作为源的SQL命令:
这样,我仍然可以远程更改SSIS OLE DB Source对象WHERE
子句(只要我不改变SELECT
部分)。
我无法想象这是非常常见的,所以我想得到一些意见 - 有更好的方法吗?我不想直接将此SP的所有代码放入OLE DB源代码编辑器中,因为我们无法在WHERE
子句更新的情况下重新部署。
答案 0 :(得分:2)
你已经得到了许多人不做的部分,并且使用Variables来推动你的包执行。你更进一步,因为你无法完全换掉你的专栏。为了迂腐,我是可以完全更改查询,只要呈现相同的元数据。
那么,这个问题就变成了如何最好地完成允许包具有由外力驱动的查询过滤器。考虑可维护性,易于调试等。
我的直觉反应是3变量
SELECT * FROM MyTable
,当然我列举了我的专栏因此,我们在OLE DB Source中使用Query,就像在那里有更长的变量名一样。这种方法的唯一缺点是,在SSIS-2012之前是表达式中字符串长度的限制。这是... 4k我相信。如果你指定一个5k字符的值,那很好。它只是在表达式语言中,将两个字符串加在一起不能超过4k。
我没有指定QueryFilter将会包含哪些内容,也没有说明将它存在的魔力。那,我将基于您的环境,用法等的更大图景,但一般的概念是它最终会变成WHERE Condition1 IS NOT NULL
但可能在完全重新加载的情况下,它变成一个空字符串。
那么,我们有什么选择来改变QueryFilter的值
dtexec /file p1.dtsx /set \Package.Variables[User::QueryFilter].Properties[Value];" WHERE Condition1 IS NOT NULL"
将它保存到.bat文件,不同的sql代理作业,等等。点击并运行即可完成。