在SSIS中使用OLE DB COMMAND的查询中的多个参数

时间:2015-03-06 20:44:06

标签: sql visual-studio-2010 parameters ssis task

我正在尝试使用OLE DB命令在SSIS中执行此更新:

UPDATE 
TABLE_A
SET 
COLUMN_C = CONCAT(?,' ',?)
FROM 
TABLE_A INNER JOIN TABLE_B ON
TABLE_A.ID = TABLE_B.ID

但是当我尝试映射参数时,我收到了这条消息:

“无法推导出参数类型,因为单个表达式包含两个无类型参数”

我不知道我是否对此查询做错了,或者是否无法在一个句子中使用多个参数。

我正在使用VS 2010

3 个答案:

答案 0 :(得分:5)

我喜欢@Billinkc的回答和评论。我只想表明有办法解决OLEDB提供商的限制。

declare @a as varchar(100) = ?
declare @b as varchar(100) = ?
UPDATE 
TABLE_A
SET 
COLUMN_C = CONCAT(@a,' ',@b)
FROM 
TABLE_A INNER JOIN TABLE_B ON
TABLE_A.ID = TABLE_B.ID

答案 1 :(得分:5)

使用SQL Server 2012及更高版本的参数绑定

SQL Server 2012及更高版本已将SQL解析器或优化器更改为使用更严格的方法来确定未知参数输入类型。

这导致SQL语句,例如“WHERE col1> =?+?”失败,出现错误,例如mx.ODBC.Error.ProgrammingError:('42000',11503,“[Microsoft] [SQL Server的ODBC驱动程序11] [SQL Server]无法推导出参数类型,因为单个表达式包含两个无类型参数,'@ P1'和'@ P2'。“,10191)。

解决方案

  1. 使用显式强制转换来告诉SQL解析器从右侧操作中期望哪种类型,例如: “WHERE col1> =?+ CAST(?as int)”。这使第二个参数成为显式类型,并允许解析器推导出结果的类型,

答案 2 :(得分:2)

问题是元数据之一。 SSIS,非常关心它。 CONCAT,2012年的新功能令人惊叹,因为它可以让您连接所有内容而不管数据类型如何,而不必担心后向网络开发人员数据类型的优先级。

我怀疑你需要

A)添加派生列转换以创建连接值。是的,这意味着您必须检查NULL,数据类型优先级和所有其他有趣的事情。

B)将您的查询更新为

UPDATE 
TABLE_A
SET 
COLUMN_C = ?
FROM 
TABLE_A INNER JOIN TABLE_B ON
TABLE_A.ID = TABLE_B.ID
WHERE
    SomethingUniquelyIdentifying = ?

然后将您的值从A)映射到第0个序号,将您的业务键映射到第二个(否则您将要将每行中的每个值更新为缓冲区中的当前值)