我正在尝试从一个表中填充一个现有的桥表,该表作为模板来填充如何填充到桥表中。
我正在尝试对桥表(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
答案 0 :(得分:0)
插入声明的其余部分朝向单行。但是,子查询可能正在返回(或有可能返回)多行。每当出现这种情况时,SQL Server就会提出这个问题。
您可能希望通过将子查询作为查询单独运行来检查,以查找是否正在返回多行,即使您正在假设"只返回一行。
如果它确实有多行,那么您需要根据您的逻辑单独处理这种情况。 但是,如果您确定只返回一行,则可以始终为MAX或MIN或TOP 1。虽然返回单行时它们是无关紧要的,但它们将避免返回多个子查询。错误。
编辑: 如果确实要插入多行,请将值短语替换为完整的选择短语,并将所有其他字段的值保留为固定值(@ ones),并将CheckName的值替换为select语句。选择@ ...,@ ...,@ ....,.... CheckListItem From ....其中BusinessUnit喜欢......除了......等等。