【问题标题】:SSIS Multiple insert statements in OLE DB CommandSSIS OLE DB命令中的多个插入语句
【发布时间】:2024-05-29 18:10:02
【问题描述】:

当我尝试在这样的 OLE DB 命令中放入多个插入语句时:

    INSERT INTO [TABLE_A] ([NAME_A]) VALUES (@a)
    INSERT INTO [RELATION_TABLE]([ID_A],[ID_B])
    VALUES (
        (SELECT [ID_A] FROM [TABLE_A] WHERE [NAME_A] = @a),
        (SELECT [ID_B] FROM [TABLE_B] WHERE [NAME_B] = @b)
    )

我收到此错误:

一个 OLE DB 记录可用。资料来源:“Microsoft SQL Server Native 客户端 11.0" Hresult: 0x80004005 描述: "子查询返回 超过 1 个值。当子查询跟随=时,这是不允许的 !=、、>= 或子查询用作表达式时。"。

每个子选择语句只返回一条记录。变量已被声明和设置。 有什么建议可以解决这个问题或错误到底在哪里?

【问题讨论】:

  • 似乎实际上返回了超过 1 个值。用 SELECT 代替 INSERT。
  • 如果输出的记录无关紧要,ID_A和ID_B使用max

标签: sql sql-server ssis oledb


【解决方案1】:

我建议运行这个查询:

SELECT a.ID_A, b.ID_B
FROM TABLE_A a JOIN
     TABLE_B b
     ON a.NAME_A = @a AND b.NAME_B = @b;

这可能会返回重复项——表明您对数据有误。有重复。您可能应该修复数据并在每个表中的 name 上创建唯一索引或约束,以确保数据完整性。

如果这返回了你想要的,那么插入语句为:

INSERT INTO [RELATION_TABLE]([ID_A],[ID_B])
    SELECT a.ID_A, b.ID_B
    FROM TABLE_A a JOIN
         TABLE_B b
         ON a.NAME_A = @a AND b.NAME_B = @b;

【讨论】:

    【解决方案2】:

    确保选择语句只返回一个值。

    SELECT [ID_A] FROM [TABLE_A] WHERE [NAME_A] = @a
    SELECT [ID_B] FROM [TABLE_B] WHERE [NAME_B] = @b
    

    【讨论】:

      最近更新 更多