Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
最佳实践:为“发送存储过程”;来自变量“的SQL命令”;在OLE DB源中?_Sql_Sql Server_Stored Procedures_Ssis - Fatal编程技术网

最佳实践:为“发送存储过程”;来自变量“的SQL命令”;在OLE DB源中?

最佳实践:为“发送存储过程”;来自变量“的SQL命令”;在OLE DB源中?,sql,sql-server,stored-procedures,ssis,Sql,Sql Server,Stored Procedures,Ssis,在SSIS ETL中,我需要在不允许创建存储过程的服务器/db上运行一个查询 我通常使用变量中的存储过程作为OLE DB源的源: 但是,由于我们无法将存储过程放在此服务器上,我打算通过执行SQL语句,从主数据库检索文本,将存储过程的代码存储到变量中,然后使用存储在该变量中的文本作为源的SQL命令: 这样,我仍然可以远程更改SSIS OLE DB源对象WHERE子句(只要我不更改SELECT部分) 我无法想象这是非常普遍的,所以我想得到一些意见-有没有更好的方法来做到这一点?我不想将此SP的所

在SSIS ETL中,我需要在不允许创建存储过程的服务器/db上运行一个查询

我通常使用变量中的存储过程作为OLE DB源的源:

但是,由于我们无法将存储过程放在此服务器上,我打算通过执行SQL语句,从主数据库检索文本,将存储过程的代码存储到变量中,然后使用存储在该变量中的文本作为源的SQL命令:

这样,我仍然可以远程更改SSIS OLE DB源对象
WHERE
子句(只要我不更改
SELECT
部分)


我无法想象这是非常普遍的,所以我想得到一些意见-有没有更好的方法来做到这一点?我不想将此SP的所有代码直接放入OLE DB源代码编辑器中,因为在出现
WHERE
子句更新的情况下,我们负担不起重新部署的费用。

您已经完成了许多人不做的部分,并且正在使用变量来驱动包的执行。更正确的是,您不能完全交换列。我是学究,只要呈现相同的元数据,就可以完全更改查询

因此,这个问题变成了如何最好地实现允许包具有由外力驱动的查询过滤器。考虑到可维护性、易调试性等因素

我的直觉反应是3个变量

  • QueryBase:String。硬编码<代码>从MyTable中选择*
  • 查询:字符串。EvaluateExpression=True表达式:@[User::QueryBase]+@[User::QueryFilter]
  • 查询过滤器:字符串
因此,我们在OLEDB源代码中使用查询,就像在其中有较长的变量名一样。SSIS-2012之前的这种方法唯一的缺点是对表达式中字符串长度的限制。那是。。。我相信是4k。如果指定的值为5k个字符,则可以。只是在表达式语言中,将两个字符串相加不能超过4k

我没有具体说明QueryFilter将包含什么内容,也没有具体说明它的魔力。我会根据您的环境、使用情况等的大局进行分析。但一般的概念是,它最终会变成
,其中Condition1不是NULL
,但在完全重新加载的情况下,它可能会变成一个空字符串

那么,更改QueryFilter值的选项是什么

  • 是传递给调用进程(dtexec.exe)的可选参数,该进程使SSIS包运行。如果您的选择非常有限,并且不想构建额外的基础设施来支持参数,只需硬编码一些示例。大约
    dtexec/file p1.dtsx/set\Package.Variables[User::QueryFilter].Properties[Value];“WHERE Condition1不为NULL”
    将其保存到.bat文件、不同的sql代理作业中。单击并运行,您就完成了
  • 配置方法。SSIS提供了本机功能,可以使用从SQL Server表、XML、注册表、父包和环境变量(从2005年到当前版本)的配置。这种方法唯一的缺点是它不支持像第一种方法那样使用不同参数的并发执行
  • 环境方针。2012年和2014年,他们的新项目部署模型为我们提供了SSIDB目录中的环境概念,这类似于SQL Server表的配置,但它是在开发完成并部署包之后完成的。这很好,因为它构建了所用值的历史记录,所以如果有人问为什么数据都错了,您可以编写一个查询来提取所用的参数,哦,看,有人使用了初始负载过滤器,而不是每日负载过滤器。哇。对并发执行和更改值的关注也是一样的
  • 表驱动方法。与使用SQL Server表备份的配置不同,您可以滚动自己的表,然后将执行SQL任务添加到包中,以将筛选器(单行)检索到QueryFilter变量中
  • 脚本任务。使用漂浮在船上的任何东西来确定过滤器应该是什么
  • 消息队列。他们已经内置了一个,如果你已经在做的话,在这里可能会有用。否则,就太难管理了

  • 可能是从主数据库加载相关查询的脚本数据源?虽然我不确定这是否真的更好。也许我们应该问问idkfa。你的麻烦会得到一张赞成票。。。以及您的推荐人;)感谢billinkc,我最初计划使用您描述的选项4。我们是2008 R2,所以我只能选择选项3(听起来不错)。