none
SSIS中如何实现参数的子查询功能 RRS feed

  • 问题

  • 我在做SSIS的时候,用“执行SQL任务”组件,里面写的源选择的是“OLEDB”,sqlstatment里面写了这样一条语句?“DELETE FROM dbo.FactDealerOrderDetail
    where DealerOrderHeadKey in(
    select DealerOrderHeadKey from dbo.FactDealerOrderHead
    where DateKey between ? and ? )”,其实就是用了参数化子查询,然后运行错误,如何解决,不想用存储过程,希望详细一点,谢谢
    • 已编辑 zuocl 2009年11月23日 5:32
    2009年11月18日 8:18

答案

全部回复

  • 我FactDealerOrderHead(表头) 中的主键是DealerOrderHeadKey,是FactDealerOrderDetail(明细)的外键
    MSDN有解释,但是看不懂,MSDN解释为“使用 OLE DB 连接管理器时,不能使用参数化子查询,这是因为 OLE DB 源不能通过 OLE DB 访问接口派生参数信息。但是,您可以使用表达式将参数值连接到查询字符串并设置该源的 SqlCommand 属性”,关键是如何写表达式,如何设置属性??
    2009年11月18日 8:22
  • 请你提供错误信息?

    当你直接运用无参数SQL语句时,你是否可以成功执行?

    谢谢。
    2009年11月18日 9:51
  • 请问您是用了“执行SQL任务”,还是数据流/OLE DB 源?
    谢谢。

    2009年11月18日 9:53
  • 执行sql任务组件
    2009年11月19日 1:43
  • 出错信息为“[执行 SQL 任务] 错误: 执行查询“DELETE FROM FactDealerOrderDetail WHERE (DealerOrderHeadKey IN           (SELECT DealerOrderHeadKey          FROM FactDealerOrderHead          WHERE (DateKey BETWEEN ? AND ?)))”失败,错误如下:“无法从带子选择的查询 SQL 语句中获得参数信息。在准备命令前,请设置参数信息。”。失败的原因可能有: 查询本身有问题、未正确设置 "ResultSet" 属性、未正确设置参数或未正确建立连接。 ”
    • 已建议为答案 weehyong 2009年11月23日 1:57
    • 取消建议作为答案 zuocl 2009年11月25日 8:52
    2009年11月19日 1:45
  • 你是否直接对数据库运用完整的查询?

    在执行sql任务组件中, 你是否设置好 "Parameter Mapping"?
    你的两个 "?" 的值从哪立刻获得?
    2009年11月23日 2:06
  • 先将用参数值格式化的语句放到数据库里面去执行一下 看有没有报错提示

    这2个问号的值没有格式化 就直接去执行 是肯定会报错的  

    2009年11月23日 3:44
  • 使用了参数映射,但是不行,提示如上面的错误
    2009年11月23日 5:22
  • 数据库里面是可以执行的,但是放到SSIS的数据库任务就不行了,如果把“?”换成具体的值就行了
    做过BI,SSIS的人肯定都遇到过这样的问题,不知道别人是如何解决的!就是子查询中带参数,你在“Parameter Mapping”里面添加参数还是会报错,改写语句也不行,有兴趣的人也可以做个demo,除非用存储过程
    2009年11月23日 5:31
  • http://msdn.microsoft.com/zh-cn/library/ms141696.aspx,msdn的解释,我看不懂!
    “使用 OLE DB 连接管理器时,不能使用参数化子查询,这是因为 OLE DB 源不能通过 OLE DB 访问接口派生参数信息。但是,您可以使用表达式将参数值连接到查询字符串并设置该源的 SqlCommand 属性。在 SSIS 设计器中,您可以使用“OLE DB 源编辑器”对话框配置 OLE DB 源,并在“设置查询参数”对话框中将参数映射到变量。”
    2009年11月23日 5:51
  • 在你的 "Parameter Mapping" 中,你用的参数名  (Parameter Name) 是什么?
    当你用OLE DB 连接管理器时, 你需要把第一个?映射到参数名0, 第二个?映射到参数名1。

    谢谢。
    2009年11月24日 4:16
  •   请看以下的图。

    执行sql任务组件



    把第一个?映射到参数名0, 第二个?映射到参数名1。



    2009年11月24日 7:32
  • 这个我做了,不带子查询的我都做成功了,就是带参数的子查询会失败!因为参数无法传到子查询里面,改用join写还是会报错!难道你机子上带子查询的语句是可以传参数,如果是那样的话,是不是我的sqlserver版本问题,我的sqlserver2005,是不是有什么升级包
    2009年11月24日 9:55
  • 使用执行sql任务组件的 Expression, 如下:



    点以下 "...", 然后定义Expression


    • 已建议为答案 weehyong 2009年11月26日 3:29
    2009年11月25日 8:15
  • 看不到图,能不能发到我的邮箱里面!zuoconglin@163.com,谢谢
    2009年11月25日 8:45
  • 看不到图,能不能发到我的邮箱里面!zuoconglin@163.com,谢谢

    我已发邮件到你的邮箱。
    请看看是否解决了你的问题。谢谢。
    2009年11月26日 1:18
  • 看不到图,能不能发到我的邮箱里面!zuoconglin@163.com,谢谢

    我已发邮件到你的邮箱。
    请看看是否解决了你的问题。谢谢。

    邮件收到,问题解决!谢谢
    2009年11月26日 3:04