代码之家  ›  专栏  ›  技术社区  ›  Anonymouslemming

SSIS中的SQL参数化

  •  0
  • Anonymouslemming  · 技术社区  · 14 年前

    我正在尝试对ssis中的一些查询进行参数化。在阅读了一些文章之后,我的最佳选择似乎是创建一个包含我的基本SQL的变量,另一个包含我的条件的变量,最后一个作为包含这两个条件的表达式进行计算的变量。我希望最终得到一个有效的SQL查询

    更新myTable设置something='bar'其中something='foo'

    因此,前两个变量具有包的作用域,如下所示:

    姓名: 巴斯克
    数据类型:
    价值观: 更新myTable设置something='bar'在其他位置=

    姓名: My变量
    数据类型:
    价值观:

    我的第三个变量有一个数据流任务的范围,我想在其中使用这个SQL,如下所示:
    姓名: SQL查询
    数据类型:
    价值观: @[用户::basesql]+“'”+@[用户::myvariable]+“'”
    评估表达:

    在OLE DB源中,然后选择连接和“变量中的SQL命令”,并从下拉框中选择用户::sqlquery。变量值窗口随后显示以下内容:

    @[用户::basesql]+“'”+@[用户::myvariable]+“'”

    这是所需要的,并将提供我想要的来自我的数据库的输出。

    变量名下拉列表还包含user::basesql和user::my variable,因此我相信我的命名空间是正确的。

    但是,当我单击“预览”时,在配置OLE DB源(使用变量中的SQL命令)时会出现以下错误:

    标题:Microsoft Visual Studio

    在数据库中设置运行时出错[在MyDB数据库中设置运行时]:ssis错误代码dts eu e eu oledberror。发生了OLE DB错误。错误代码:0x80040E14。
    有一个OLE DB记录可用。源:“Microsoft SQL Server Native Client 10.0”hresult:0x80040e14描述:“无法准备语句。”。
    有一个OLE DB记录可用。源:“Microsoft SQL Server Native Client 10.0”hresult:0x80040e14 description:“must declare the scalar variable”@“。
    (Microsoft Visual Studio)

    有人能告诉我遗漏了什么或者我如何解决这个问题吗?

    事先谢谢!

    3 回复  |  直到 12 年前
        1
  •  2
  •   Cheran Shunmugavel    14 年前

    你应该设置 Expression 性质 SQL查询 ,而不是 Value 财产。如果操作正确,则“变量值”窗口应显示表达式的结果:

    UPDATE mytable set something = 'bar' where something_else = 'foo'
    
        2
  •  4
  •   Martijn Pieters    12 年前

    我也有类似的问题。 似乎设计师在设计时想要一些东西。 选择变量名后,尝试单击OleDbsource任务上的“确定”时出错。

    我也遇到过类似的情况,其中WHERE子句逻辑有点复杂,需要一个脚本任务来分配它的值。 这就是设计时的情况。

    @basesql = "select from mytable where "
    @where  = empty string
    @fullsql = @basesql   + @where
    

    我收到了你上面提到的E14错误。 通过将@where的设计时间值更改为愚蠢的值,OLEDBSource任务得到了它想要的,并让我使用这个变量。

    @where = " value1 is null and value2 = 'easteregg' "
    

    相关的问题,为了让它工作,我必须首先在SQL命令中放入一个基本的select stmt,这样它就可以得到源代码列。 这是有道理的,但我和谷歌花了一段时间才弄明白。

        3
  •  1
  •   rfonn    14 年前

    我将创建一个脚本任务并将字符串连接到一个变量中,并将其用作源: dts.variables[“sqlquery”].value=dts.variables[“basesql”].value.toString()。+ dts.variables[“myvariable”].value.toString(); 然后,在“组件属性”选项卡下的“高级属性”中,需要将validateexternalmetadad属性更改为false,这样ssis就不会尝试在变量中预先验证SQL查询,这会导致运行时错误。刚刚创建了一个简单的包,这似乎是可行的。希望这有帮助。

    -赖安