2

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

我想知道如果我将我的 SQL 脚本添加到项目中的文件中,这些可以读回吗?例如,如果我提出这样的查询: select id, name from %schema%.tablename 我想将它读入一个变量,那么很容易使用表达式,就像我对项目参数所做的那样,用适当的替换 %schema%价值。然后可以轻松编辑项目中的 .sql 文件,甚至可以通过在项目进入部署流程之前禁用/删除的执行 SQL 任务进行测试。但是我一直无法找到如何使用项目中的相对路径读取文件。此外,我什至不确定这些是否已部署到 SSIS 服务器。

感谢您的任何见解。

我已将文本文件 query.sql 添加到 Visual Studio 中的 SSIS (SQL 2017) 项目中,但我发现无法将 query.sql 的内容拉入变量中。

4

2 回答 2

3

本机工具方法

对于执行 SQL 任务,可以选择直接从文件中获取查询。

将您设置SQLSourceTypeFile Connection,然后在该部分中指定文件连接管理器FileConnection

SQLSourceType = 文件连接

请注意,虽然这很方便,但对于提升权限的人来说也是成熟的。如果我有权访问 SSIS 包正在寻找的文件,我可以添加一个drop database、创建一个新用户并授予他们 SA 权限等 - 运行 SSIS 包的帐户可以做的任何事情,一个邪恶的人都可以利用。

推出自己的方法

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

  • 用户::QueryPath -> 字符串 -> C:\path\to\file.sql
  • 用户::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。请注意,这不处理检查文件是否存在,您是否有权访问等。它只是对文件的准系统读取(并且也面临与上述方法相同的注入挑战 - 正是这种方式您自己维护它与微软的优秀工程师相比)

于 2019-05-29T15:18:19.803 回答
0

您可以同时使用Variable和来构建查询Parameter

例如:

参数 A:dbo

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

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

于 2019-05-29T14:16:14.150 回答