SSIS错误:插入值列表与列列表不匹配

时间:2012-11-02 10:45:29

标签: sql sql-server ssis

在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

1 个答案:

答案 0 :(得分:1)

您遇到的问题是两件事之一。您没有在执行SQL任务中设置参数映射,或者未在同一任务的设置中设置 BypassPrepare 设置,这很可能就是这种情况。

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

  1. 仅使用查询中指定的两个表重新创建数据库。使用硬编码值对其进行测试,以确定其有效。
  2. 在我的包中添加了两个变量 - BaseID & DirectoryID 并为他们提供了一些默认值。
  3. 创建了一个SQL执行任务,并将您的查询添加到 SQLStatement
  4. 参数映射并映射两个变量,指定参数名称 0 &的 1 即可。 此时,我的 BypassPrepare 选项设置为 False ,运行该任务会导致您收到的确切错误。
  5. BypassPrepare 选项设置为 True 。执行任务导致成功,并且在没有任何问题的情况下将一行添加到数据库中。
  6. 有关此特定属性的信息(在不同的上下文中使用,但具有相同的一般功能),请参阅:http://technet.microsoft.com/en-us/library/microsoft.sqlserver.dts.tasks.executesqltask.executesqltask.bypassprepare.aspx


    <强>更新

    给出的解决方案是针对SQL执行任务,而不是针对OLE DB命令。改变'?'的位置OP所述的前面SQL查询中的值参数解决了这个问题。

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