我的SSIS项目倾向于在环境之间移动时运行需要更改的查询,例如表架构可能更改或Where子句中的值。我总是将我的SQL放入“项目参数”(由于格式丢失而很难编辑),或者只是直接将其放入“执行SQL任务/数据流源”,然后在迁移之间手动对其进行编辑,这也不理想。
我想知道是否将SQL脚本添加到项目中的文件中,是否可以读回这些文件?例如,如果我输入这样的查询: 选择ID,从%schema%.tablename中命名 我想将其读入变量,然后像使用项目参数一样使用表达式来轻松地将%schema%替换为适当的值。然后,可以轻松编辑项目中的.sql文件,甚至通过在项目进入部署流程之前已禁用/删除的“执行SQL任务”进行测试。但是我一直无法找到如何使用项目内的相对路径读取文件的方法。另外,我什至不确定这些内容是否已部署到SSIS服务器。
感谢您的见解。
我已在Visual Studio中的SSIS(SQL 2017)项目中添加了一个文本文件query.sql,有点找不到将query.sql的内容提取到变量中的方法。
答案 0 :(得分:2)
对于执行SQL任务,有一个选项可直接从文件中获取查询。
将SQLSourceType
设置为File Connection
,然后在FileConnection
部分中指定文件连接管理器。
请注意,尽管这很方便,但对于逐步升级其权限的人来说也已经成熟。如果我可以访问SSIS包正在寻找的文件,则可以添加drop database
,创建新用户并向他们授予SA权限,等等-运行SSIS包的帐户可以做的任何事情,一个邪恶的人可以利用。
如果您坚持要自己读取文件,请将两个变量添加到SSIS包中,并提供如下所示的值
将脚本任务添加到包中。指定为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)
您可以同时使用Variable
和Parameter
来构建查询。
例如:
参数A:dbo
将变量A(字符串类型)构建为:"Select * FROM server.DB." + ParameterA + ".Table"
因此,如果您需要更改架构,只需更改参数A即可在变量A中为您提供相应的查询。