SSIS 在 SQL 命令中使用 ODBC 传递参数
SSIS passing paramater in SQL command with ODBC
我正在尝试 运行 OBDC 的表达式生成器 SQL 命令中的变量。
表达式如下所示
"SELECT Date(Curdate()) AS 'Load Date',
Sum(CASE
WHEN pomstatus = 'TBR'
AND Date(portdate) < Curdate() THEN 1
ELSE 0
END) AS 'Total Removes',
Min(CASE
WHEN pomstatus = 'TBR' THEN portdate
ELSE 'N/A'
END) AS 'Oldest Removes',
Sum(CASE
WHEN pomstatus = 'TBR'
AND Date(portdate) < Curdate()
AND Date(portdate) > Subdate(Curdate(), @[User::Days] )THEN 1
ELSE 0
END) AS 'Total New Removes',
Sum(CASE
WHEN pomstatus = 'TBR'
AND acctype = 'b'
AND Date(portdate) < Curdate() THEN 1
ELSE 0
END) AS 'SOHO Removes',
Sum(CASE
WHEN pomstatus = 'C-U'
AND Date(dd) < Curdate() THEN 1
ELSE 0
END) AS 'Total Confirmed U',
Min(CASE
WHEN pomstatus = 'C-U' THEN dd
ELSE 'N/A'
END) AS 'Oldest Confirmed U',
Sum(CASE
WHEN pomstatus = 'C-U'
AND discoservice LIKE '%s%'
AND Date(dd) < Curdate()THEN 1
ELSE 0
END) AS 'Total Confirmed Satellite',
Min(CASE
WHEN pomstatus = 'C-U'
AND discoservice LIKE '%s%' THEN dd
ELSE 'N/A'
END) AS 'Oldest Confirmed Satellite',
Sum(CASE
WHEN pomstatus = 'C-U'
AND Date(dd) < Curdate()
AND Date(dd) > Subdate(Curdate(), @[User::Days] ) THEN 1
ELSE 0
END) AS 'Total New Confirmed U',
Sum(CASE
WHEN pomstatus = 'pwo' THEN 1
ELSE 0
END) AS 'Total Pending WO',
Sum(CASE
WHEN pomstatus = 'etbr' THEN 1
ELSE 0
END) AS 'Total Escalated TBR',
Sum(CASE
WHEN pomstatus = 'wtnr' THEN 1
ELSE 0
END) AS 'Total Waiting TNR'
FROM POM.mainorders
WHERE acctype <> 'c';"
我收到以下错误:
弹出错误
我测试了相同的脚本,但用数字 2 替换了 2 个变量并且成功了,所以我知道脚本本身正在运行。在我看来变量没有正确传递。
至于我如何填充变量,变量是从执行 SQL 任务中填充的,如下图所示:
执行SQL任务
执行SQL任务
查询生成器结果
无法识别字符串中的变量
尝试将字符串与此连接:
Subdate(Curdate(), "+ @[User::Days] + " )
就个人而言,我会在数据库中创建一个存储过程并传递两个参数,但并不是每个人都可以这样做。
这不是参数与执行 SQL 任务一起工作的方式。
要么按照@KeithL 的建议使用字符串连接,要么将变量 (@[User::Days]) 正确映射到参数(取决于您的提供者 - 基于序数的 ?
标记或命名参数 @myvalue
)
由于您的提供者指示 OLE DB,您将需要使用 ?
作为占位符,然后它变成一个基于 0 的序号系统。点击参数映射,参数名称为0
,变量为@[User::Days]
另请参阅联机丛书 - Map Query Parameters to Variables in an Execute SQL Task
我正在尝试 运行 OBDC 的表达式生成器 SQL 命令中的变量。
表达式如下所示
"SELECT Date(Curdate()) AS 'Load Date',
Sum(CASE
WHEN pomstatus = 'TBR'
AND Date(portdate) < Curdate() THEN 1
ELSE 0
END) AS 'Total Removes',
Min(CASE
WHEN pomstatus = 'TBR' THEN portdate
ELSE 'N/A'
END) AS 'Oldest Removes',
Sum(CASE
WHEN pomstatus = 'TBR'
AND Date(portdate) < Curdate()
AND Date(portdate) > Subdate(Curdate(), @[User::Days] )THEN 1
ELSE 0
END) AS 'Total New Removes',
Sum(CASE
WHEN pomstatus = 'TBR'
AND acctype = 'b'
AND Date(portdate) < Curdate() THEN 1
ELSE 0
END) AS 'SOHO Removes',
Sum(CASE
WHEN pomstatus = 'C-U'
AND Date(dd) < Curdate() THEN 1
ELSE 0
END) AS 'Total Confirmed U',
Min(CASE
WHEN pomstatus = 'C-U' THEN dd
ELSE 'N/A'
END) AS 'Oldest Confirmed U',
Sum(CASE
WHEN pomstatus = 'C-U'
AND discoservice LIKE '%s%'
AND Date(dd) < Curdate()THEN 1
ELSE 0
END) AS 'Total Confirmed Satellite',
Min(CASE
WHEN pomstatus = 'C-U'
AND discoservice LIKE '%s%' THEN dd
ELSE 'N/A'
END) AS 'Oldest Confirmed Satellite',
Sum(CASE
WHEN pomstatus = 'C-U'
AND Date(dd) < Curdate()
AND Date(dd) > Subdate(Curdate(), @[User::Days] ) THEN 1
ELSE 0
END) AS 'Total New Confirmed U',
Sum(CASE
WHEN pomstatus = 'pwo' THEN 1
ELSE 0
END) AS 'Total Pending WO',
Sum(CASE
WHEN pomstatus = 'etbr' THEN 1
ELSE 0
END) AS 'Total Escalated TBR',
Sum(CASE
WHEN pomstatus = 'wtnr' THEN 1
ELSE 0
END) AS 'Total Waiting TNR'
FROM POM.mainorders
WHERE acctype <> 'c';"
我收到以下错误:
弹出错误
我测试了相同的脚本,但用数字 2 替换了 2 个变量并且成功了,所以我知道脚本本身正在运行。在我看来变量没有正确传递。
至于我如何填充变量,变量是从执行 SQL 任务中填充的,如下图所示:
执行SQL任务
执行SQL任务
查询生成器结果
无法识别字符串中的变量
尝试将字符串与此连接:
Subdate(Curdate(), "+ @[User::Days] + " )
就个人而言,我会在数据库中创建一个存储过程并传递两个参数,但并不是每个人都可以这样做。
这不是参数与执行 SQL 任务一起工作的方式。
要么按照@KeithL 的建议使用字符串连接,要么将变量 (@[User::Days]) 正确映射到参数(取决于您的提供者 - 基于序数的 ?
标记或命名参数 @myvalue
)
由于您的提供者指示 OLE DB,您将需要使用 ?
作为占位符,然后它变成一个基于 0 的序号系统。点击参数映射,参数名称为0
,变量为@[User::Days]
另请参阅联机丛书 - Map Query Parameters to Variables in an Execute SQL Task