【问题标题】:Read file in SSIS Project into a variable将 SSIS 项目中的文件读入变量
【发布时间】:2019-05-29 13:42:11
【问题描述】:

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

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

感谢您的任何见解。

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

【问题讨论】:

  • 你考虑过将 ssis 包与 sql 解耦吗?您可以将 sql 移动到存储过程,然后从包中调用 sql。您甚至可以在数据库中某处的表中添加一个标志,以确定存储过程正在运行的环境。 proc 可以在存储过程中自动读取 flag 并设置变量,而无需每次手动更改它们。

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


【解决方案1】:

原生工具方法

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

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

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

推出自己的方法

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

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

【讨论】:

    【解决方案2】:

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

    例如:

    参数A:dbo

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

    所以如果你需要改变schema,只要改变参数A就会在变量A中给你对应的查询。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-15
      • 2021-09-19
      • 1970-01-01
      • 2011-05-04
      相关资源
      最近更新 更多