【问题标题】:Dynamically Create Views from parameters/variables SQL SSIS从参数/变量 SQL SSIS 动态创建视图
【发布时间】:2017-07-08 00:07:52
【问题描述】:

我有一个包含不到一百万行的表。我正在使用 SSIS 构建一个表单,该表单要求用户输入并使用这些值作为参数来从源数据构建视图。我无法让 SSIS 从变量创建视图。

这个“工具”的目的是提供一个对话,该对话以编程方式构建一个视图,然后是一个更新语句,该语句基于通过将执行 SSIS 包的表单定义的参数。我团队中的许多人都知道 0 SQL。因此,这绕过了任何 SQL 知识。创建一个完全独立的应用程序并不理想,因为我需要太多额外的开销,并且会偏离我们目前使用 SSIS/SQL 来实现类似结果的许多现有流程。

这就是我尝试过的。

我有一个包含“执行 SQL 任务”的 SSIS 包

此任务会生成一个包含 5 个输入(变量)的表单 变量 1、变量 2、变量 3、变量 4、变量 5。 有些变量是字符串,有些是双精度数、整数等...(它们都不同)

您填充字段并点击确定。 这些变量被传递给“执行包任务”。 这个包里面(包B) 变量用于“执行 SQL 任务”。

此任务正在尝试获取用户输入并使用包含 4 个其他变量的 where 子句创建一个视图。

示例:

Create View ? AS Select col1,col2,col3,col4 WHERE
col1 = ?
AND col2 =?
AND col3 =?.........

首先看起来使用 ?在创建视图中无效。 错误是:

Error: 0x0 at Build_Query: Incorrect syntax near '@P1'.
Error: 0xC002F210 at Build_Query, Execute SQL Task: Executing the query "CREATE VIEW ? as Select * from S_t_equip_template
..." failed with the following error: "The batch could not be analyzed because of compile errors.". Possible failure reasons: Problems with the query, "ResultSet" property not set correctly, parameters not set correctly, or connection not established

 correctly.
Task failed: Build_Query

如果我使用创建视图变量作为表达式并删除 where 语句的变量/参数,我可以毫无问题地创建视图。 但是,一旦我将 where 语句添加回来,它们就会引发错误。我尝试将它们作为“执行 SQL 任务”中的表达式进行评估,但由于它们是各种类型,我得到了错误:

[Execute SQL Task] Error: Executing the query "
CREATE VIEW testing AS SELECT
P.label,P.uniq..." failed with the following error: "The metadata could not 
be determined because statement 'CREATE VIEW testingagain AS SELECT
P.label,P.uniqueid,C.label as Child_Label,C.uniqueid as Child_uni' does not 
support metadata discovery.". Possible failure reasons: Problems with the 
query, "ResultSet" property not set correctly, parameters not set correctly, 
or connection not established correctly.

不知道发生了什么。任何帮助将不胜感激

我在谷歌上搜索了错误并找到了一些信息,但其他用例如此不同,以至于很难理解实际原因或其他解决方法。

按要求(简化示例): 我创建了一个包变量(数据类型字符串),名为:View_Name

执行 SQL 任务:

CREATE VIEW @[User::View_Name] AS SELECT
* from table1 
where col1 = 100;

具体来说,我不喜欢在这里使用变量。 如果我设置视图名称,一切正常,直到:我继续使用包含变量的 Where 子句。

创建一个名为type(数据类型int)的变量

我在我的 sql 任务中映射变量/参数

例子:

CREATE VIEW tempTable AS SELECT
    * from table1 
    where col1 = ?;

这不起作用,同样的错误。

如果我尝试通过一个或多个表达式执行上述操作,我会收到以下错误

[Execute SQL Task] Error: Executing the query "CREATE VIEW test_45678 AS SELECT P.label,P.uniquei..." failed with the following error: "Must declare the scalar variable "@".". Possible failure reasons: Problems with the query, "ResultSet" property not set correctly, parameters not set correctly, or connection not established correctly.

通常不能以这种方式评估变量。我猜我需要单独评估每个部分并逐个构建表达式。这很好,但是非常低效且不可维护。

【问题讨论】:

  • 你能显示步骤详情吗?
  • @artm 帖子更新了示例
  • SSIS 确实不是为交互式使用而构建的,动态 SQL 通常是数据库中的最后手段。你为什么要做这一切?可能有更好的方法。关于您的错误:您是否尝试过在包含完整 CREATE VIEW 定义的变量中创建一个表达式,然后对其进行评估,然后在 SSMS 中运行它以确认它是否有效,然后使用“SQL From Variable”运行 SQL 任务
  • 但我真的很好奇你为什么要这样做。您是否尝试通过视图解决性能问题?它不会有所作为。是底层索引有所作为
  • 您为什么希望用户能够在数据库中创建一堆视图?听起来是个糟糕的主意。

标签: sql-server ssis


【解决方案1】:

在尝试评估我的表达时,我有一些基本的误解。特别是语法问题,并且必须将每个变量转换为字符串。 我的 SQL 语句变量

ON C.pid = P.ID 
where
C.width >="+(DT_WSTR, 8)@[User::Width] +"-"+ (DT_WSTR, 8)@[User::Range]+........

最终的表达式如下所示:

"Create View "+@[User::View_Name] + " AS SELECT " + @[User::SQLStatement]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-18
    • 1970-01-01
    • 2018-12-28
    • 2014-02-06
    • 2016-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多