Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server Where子句中包含用户变量的SSIS包_Sql Server_Ssis_Script Task_User Variables - Fatal编程技术网

Sql server Where子句中包含用户变量的SSIS包

Sql server Where子句中包含用户变量的SSIS包,sql-server,ssis,script-task,user-variables,Sql Server,Ssis,Script Task,User Variables,简单地说,我试图获取用户输入,将其存储在变量中,然后在查询中使用该变量 首先,我有一个脚本任务,它打开一个带有简单输入文本框和按钮的窗口。单击后,文本将被放入用户变量中,并弹出一个消息框来显示用户变量中的内容。单击消息框上的“确定”将关闭消息框和原始窗口。这似乎很有效 接下来,我有一个执行SQL任务。设置如下: 一般的 结果集=无 连接类型=OLE DB 连接=localhost.DB SQLSourceType=直接输入 SQLStatement=[下面显示的SQL代码] 参数映射 变量

简单地说,我试图获取用户输入,将其存储在变量中,然后在查询中使用该变量

首先,我有一个脚本任务,它打开一个带有简单输入文本框和按钮的窗口。单击后,文本将被放入用户变量中,并弹出一个消息框来显示用户变量中的内容。单击消息框上的“确定”将关闭消息框和原始窗口。这似乎很有效

接下来,我有一个执行SQL任务。设置如下:

一般的

  • 结果集=无
  • 连接类型=OLE DB
  • 连接=localhost.DB
  • SQLSourceType=直接输入
  • SQLStatement=[下面显示的SQL代码]
参数映射

  • 变量名=用户::VarName
  • 方向=输入
  • 数据类型=VARCHAR
  • 参数名称=0
  • 参数大小=65535
结果集-不适用

表达式-不适用

[SQL代码]

if object_id('TEST.dbo.TEST','U') is not null
    drop table TEST.dbo.TEST;


SELECT
    coalesce(FSC.a, format(cast(SVY.b as int),'000')) as ab,
    SVY.c,
    PP.d,
    SV1.e,
    PP.f,
    PP.g,
    cast(PP.g as float) AS g,
    SV1.h,
    SV1.i,
    SVY.j,
    SVY.k,
    format(cast(SVY.l as int), '00000') as l,
    CAST(SVY.m AS float) AS m,
    SVY.n,
    SV1.o,
    SVY.p,

    cast(PID.q as float) as q,
    cast(PID.r as float) as r,
    cast(PID.s as float) as s,
    cast(PID.t as float) as t,

    PID.u as u,
    PID.v as v,

    PP.w,

    CAL_B.x as x,
    CAL_B.y as y,
    CAL_B.z as z,

    CAL_R.aa as aa,
    CAL_R.bb as bb,
    CAL_R.cc as cc

into TEST.dbo.TEST

FROM AAA.dbo.AAA PP

INNER JOIN BBB.dbo.BBB PPC
    ON PP.x = PPC.x
    AND cast(PP.x as date) = cast(PPC.x as date)

RIGHT OUTER JOIN CCC.dbo.CCC SVY
    ON PPC.x = SVY.x
    AND cast(PPC.x as date) = cast(SVY.x as date)

LEFT OUTER JOIN DDD.dbo.DDD FSC
    ON SVY.x = FSC.x
    AND cast(SVY.x as date) = cast(FSC.x as date)

LEFT OUTER JOIN EEE.dbo.EEE SV1
    ON SVY.x = SV1.x
    AND SVY.x = SV1.x
    AND SVY.x = SV1.x
    AND SVY.x = SV1.x
    AND cast(SVY.x as date) = cast(SV1.x as date)
    AND PPC.x = SV1.x
    AND cast(PPC.x as date) = cast(SV1.x as date)

INNER JOIN FFF.dbo.FFF RLS
    ON SV1.x = RLS.x
    AND SV1.x = RLS.x
    AND cast(SV1.x as date) = cast(RLS.x as date)
    AND SVY.x = RLS.x
    AND SVY.x = RLS.x
    AND SVY.x = RLS.x
    AND cast(SVY.x as date) = cast(RLS.x as date)

LEFT OUTER JOIN GGG.dbo.GGG PID
    ON PP.x = PID.x
    AND coalesce(FSC.x, format(cast(SVY.x as int),'000')) = PID.x

LEFT OUTER JOIN HHH.dbo.HHH CAL_B
    ON cast('20' + SUBSTRING(RLS.x,4,2) + '-' + SUBSTRING(RLS.x,6,2) + '-' + SUBSTRING(RLS.x,8,2) as date) = CAL_B.x
    AND CAL_B.x = 1

LEFT OUTER JOIN III.dbo.III CAL_R
    ON cast('20' + SUBSTRING(RLS.x,4,2) + '-' + SUBSTRING(RLS.x,6,2) + '-' + SUBSTRING(RLS.x,8,2) as date) = CAL_R.x
    AND CAL_R.x = 1

where
    cast(SVY.x as date) = (select cast(max(x) as date) from JJJ.dbo.JJJ)
    and
    PP.x is not null
    and
    SVY.x in ( ? )
问题是:我运行包。文本输入框打开。我在文本中输入“CN05”、“CN06”(不带双引号),然后单击“确定”。弹出一个框,显示我的输入。我点击OK。工作流继续执行SQL任务。在1秒内,任务以绿色勾选完成,没有错误。我验证TEST.dbo.TEST是否已创建,但它是空的。
现在,如果我在SSMS中运行上述代码,硬编码最后一位[…SVY.x in('CN05','CN06')],我将在大约4分钟内收回500多万条记录。我很困惑,为什么这在SSIS中不起作用。有什么想法吗?

一般来说,参数化的
子句中的位置。他们从不按我们认为应该的方式工作。相反,您可以使用SSIS版本的动态SQL来实现同样的功能。创建一个字符串变量来存储较大的SQL语句与用户输入的连接。然后,连接执行SQL任务以使用此变量

例如,请创建一个名为
SqlStatement
的新SSIS字符串变量。在变量的“属性”窗口中,通过单击省略号打开“表达式生成器”窗口。使用此表达式生成器将SQL与用户输入连接起来。下面的示例

确保将变量的
evaluatesExpression
属性设置为
True

最后,将执行SQL任务从直接输入更改为变量,并选择此变量作为源


一切就绪。您的执行SQL任务现在应该连接到使用您在表达式生成器中构建的动态SQL。祝你好运

谢谢特洛伊!工作起来很有魅力。谢谢你提供的关于为什么我的方法不起作用的补充信息。每天学习SQL的新知识。很高兴我能帮上忙。我得到的印象是,您正在构建的工具将是内部的,所以没什么大不了的,但是由于您正在接受用户输入并使用动态SQL,您可能需要做一些工作。也许,过滤掉字符或
字符。