具有多个结果的SQL Server子查询

时间:2017-04-11 12:34:13

标签: sql-server sql-server-2008

我正在尝试从一个表中填充一个现有的桥表,该表作为模板来填充如何填充到桥表中。

我正在尝试对桥表(dbo.ECN_ChecklistItem)执行新插入,其中dbo.ECN_ChecklistItem(由ECNID(外键ID)选择)的项目列表与dbo.BusinessUnit_ChecklistItem不同(由BusinessUnit选择并且INUSE)。

我收到一条SQL异常,说明" Sub查询返回的值超过1。当子查询遵循以下=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。"

我试图修改查询以包含' in'运算符而不是' ='运营商,但也没有成功。我可能做错了。

CREATE PROCEDURE checkCurrentChecklistItemsAgainstInUseItems
        --Parameters
        @ECNID INT, --I need the ECNID to do the search properly.
        @BU NVARCHAR(50),
        @Date NVARCHAR(10), --This is the date that the checklist item was added to the ECN.
        @NewStatus NVarchar(3) --This is based off of the status of the ECN, will either be '?' or 'No'

    AS
    BEGIN

        DECLARE @System NCHAR(6)='SYSTEM'
        DECLARE @Message NVARCHAR(50) = 'This value was added by the system automatically.'--Not in use.

        SET NOCOUNT ON;

    INSERT INTO dbo.ECN_ChecklistItem (ECNID, Required, LogBy, LogDate, Description, CheckName) 
VALUES(@ECNID, @NewStatus, @System, @Date, NULL, 
    (Select ChecklistItem FROM dbo.BusinessUnit_ChecklistItem WHERE BusinessUnit Like @BU
    EXCEPT SELECT CheckName FROM dbo.ECN_ChecklistItem WHERE ECNID Like @ECNID))

    END
    GO

1 个答案:

答案 0 :(得分:0)

插入声明的其余部分朝向单行。但是,子查询可能正在返回(或有可能返回)多行。每当出现这种情况时,SQL Server就会提出这个问题。

您可能希望通过将子查询作为查询单独运行来检查,以查找是否正在返回多行,即使您正在假设"只返回一行。

如果它确实有多行,那么您需要根据您的逻辑单独处理这种情况。 但是,如果您确定只返回一行,则可以始终为MAX或MIN或TOP 1。虽然返回单行时它们是无关紧要的,但它们将避免返回多个子查询。错误。

编辑: 如果确实要插入多行,请将值短语替换为完整的选择短语,并将所有其他字段的值保留为固定值(@ ones),并将CheckName的值替换为select语句。选择@ ...,@ ...,@ ....,.... CheckListItem From ....其中BusinessUnit喜欢......除了......等等。