1

在 ssis 组件 OLE DB 命令中:

insert into D_MAPPING_CLIENTS (ID, DIRECTORY_ID, SOURCE_ID, BASE_ID)
  values (

     case when exists ( select 1 from D_MAPPING_CLIENTS )
           then ( select MAX(ID) + 1 from D_MAPPING_CLIENTS )

         else 1
     end

  , ISNULL(?, 
      case when exists ( select 1 from D_MAPPING_CLIENTS )
             then ( select MAX(DIRECTORY_ID) + 1 from D_MAPPING_CLIENTS )

           else 1
       end ) 

   , ( select ID from D_SOURCES_CLIENTS where SOURCE = 'D:\load\1\clients.txt' )

   , ?)

当我尝试保存它时,我收到一个错误:“插入值列表与列列表不匹配”,尽管当我在 Management Studio 中运行此脚本时它工作正常。

有什么问题?

UPD:我在哪里替换最后一个“?” 对某些价值来说它工作正常:o

4

1 回答 1

1

您遇到的问题是两件事之一的结果。要么您没有在 Execute SQL 任务中设置参数映射,要么没有在同一任务的设置中设置BypassPrepare设置,这很可能是这种情况。

我设法重新创建您的错误,并绕过它。我遵循的步骤如下:

  1. 仅使用查询中指定的这两个表重新创建了您的数据库。使用硬编码值对其进行测试,以确保它有效。
  2. 在我的包中添加了两个变量 - BaseIDDirectoryID并为它们提供了一些默认值。
  3. 创建了一个 SQL Execute Task 并将您的查询添加到SQLStatement
  4. 转到参数映射并映射指定参数名称01的两个变量。此时我的BypassPrepare选项设置为False,运行任务会导致您收到的确切错误。
  5. BypassPrepare选项设置为True。执行任务导致成功,并且一行被添加到数据库中,没有任何问题。

有关此特定属性的信息(在不同的上下文中使用,但具有相同的一般功能),请参阅:http://technet.microsoft.com/en-us/library/microsoft.sqlserver.dts.tasks.executesqltask.executesqltask。绕过准备.aspx


更新

给出的解决方案是针对 SQL 执行任务,而不是针对 OLE DB 命令。更改“?”的位置 如 OP 所述,SQL 查询中的 value 参数可以解决此问题。

另一种选择是退回到调用存储过程。

于 2012-11-02T11:39:26.970 回答