将SSIS项目中的文件读入变量

时间:2019-05-29 13:42:12

标签: sql-server ssis etl ssis-2017 execute-sql-task

我的SSIS项目倾向于在环境之间移动时运行需要更改的查询,例如表架构可能更改或Where子句中的值。我总是将我的SQL放入“项目参数”(由于格式丢失而很难编辑),或者只是直接将其放入“执行SQL任务/数据流源”,然后在迁移之间手动对其进行编辑,这也不理想。

我想知道是否将SQL脚本添加到项目中的文件中,是否可以读回这些文件?例如,如果我输入这样的查询: 选择ID,从%schema%.tablename中命名 我想将其读入变量,然后像使用项目参数一样使用表达式来轻松地将%schema%替换为适当的值。然后,可以轻松编辑项目中的.sql文件,甚至通过在项目进入部署流程之前已禁用/删除的“执行SQL任务”进行测试。但是我一直无法找到如何使用项目内的相对路径读取文件的方法。另外,我什至不确定这些内容是否已部署到SSIS服务器。

感谢您的见解。

我已在Visual Studio中的SSIS(SQL 2017)项目中添加了一个文本文件query.sql,有点找不到将query.sql的内容提取到变量中的方法。

2 个答案:

答案 0 :(得分:2)

本机工具方法

对于执行SQL任务,有一个选项可直接从文件中获取查询。

SQLSourceType设置为File Connection,然后在FileConnection部分中指定文件连接管理器。

SQLSourceType = File Connection

请注意,尽管这很方便,但对于逐步升级其权限的人来说也已经成熟。如果我可以访问SSIS包正在寻找的文件,则可以添加drop database,创建新用户并向他们授予SA权限,等等-运行SSIS包的帐户可以做的任何事情,一个邪恶的人可以利用。

采用自己的方法

如果您坚持要自己读取文件,请将两个变量添加到SSIS包中,并提供如下所示的值

  • User :: QueryPath->字符串-> C:\ path \ to \ file.sql
  • User :: QueryActual->字符串-> SELECT 1;

将脚本任务添加到包中。指定为ReadOnly变量User :: QueryPath并指定为ReadWrite变量User :: QueryActual

在Main中,您需要以下代码

string filePath = this.Dts.Variables["User::QueryPath"].Value.ToString();
this.Dts.Variables["User::QueryActual"].Value = System.IO.File.ReadAllText(filePath);

此事的实质是System.IO.File.ReadAllText。请注意,这不会检查文件是否存在,您是否具有访问权限等。它只是读取文件的准系统(而且还面临与上述方法相同的注入挑战-这样,您便拥有了维护它的权限)与Microsoft的优秀工程师相比)

答案 1 :(得分:0)

您可以同时使用VariableParameter来构建查询。

例如:

参数A:dbo

将变量A(字符串类型)构建为:"Select * FROM server.DB." + ParameterA + ".Table"

因此,如果您需要更改架构,只需更改参数A即可在变量A中为您提供相应的查询。