在查询多参数在SSIS使用OLE DB命令(Multiple parameters in a que

2019-10-22 04:33发布

我试图做使用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

Answer 1:

我喜欢@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


Answer 2:

参数与SQL Server 2012的结合,后来

SQL Server 2012的后来更改了SQL解析器或优化器使用确定未知参数输入类型的一个更严格的方法。

“WHERE COL1> =?+?” 这将导致SQL语句,如 到失败,错误如mx.ODBC.Error.ProgrammingError:(“42000”,11503,“[微软] [ODBC用于SQL Server驱动程序11] [SQL Server]将参数类型不能推导出因为单个表达包含两个无类型参数, '@ P1' 和 '@ P2'“。,10191)。

一个解法

  1. 使用显式强制告诉SQL解析器从右侧操作的期望哪种类型,例如“WHERE COL1> =?+ CAST(?为INT)”。 这给出了第二个参数的显式类型和允许解析器推断结果的类型,


Answer 3:

问题是元数据的一个。 SSIS,真正关心它。 CONCAT ,新在2012年,它让无论数据类型您连接一切,而不担心向后,以点净开发商的数据类型优先惊人。

我怀疑你需要

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

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号顺序和重点业务的第二(否则你将在缓冲区中的每行中的每个值更新为当前值)



文章来源: Multiple parameters in a query using a OLE DB COMMAND in SSIS