【问题标题】:Sql Insert Error -"Subquery returned more than 1 value"Sql 插入错误 - “子查询返回超过 1 个值”
【发布时间】:2014-07-18 13:57:05
【问题描述】:

在下面的代码中,我将多个用逗号分隔的值传递给@i_CustomerGroupID,将一个值传递给@i_LocationID。在这个问题中,我遇到了一个问题“子查询返回了超过1 个值。当子查询跟随=,时,这是不允许的! =、、>= 或当子查询用作表达式时。 声明已终止。”。请帮我解决问题。

ALTER PROCEDURE [dbo].[spInsertCustomerGroupLocationMap]
    -- Add the parameters for the stored procedure here
    @i_LocationID int,
    @i_CustomerGroupID varchar(100)

    --WITH ENCRYPTION
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    IF NOT EXISTS (SELECT 1 FROM CustomerGroupLocationMap WHERE LocationID = @i_LocationID AND CustomerGroupID = @i_CustomerGroupID)
    BEGIN

        INSERT INTO CustomerGroupLocationMap (LocationID, CustomerGroupID) VALUES (@i_LocationID, (SELECT * FROM dbo.CSVToTable(@i_CustomerGroupID)));

    END
END

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    你想使用insert . . . select:

        INSERT INTO CustomerGroupLocationMap(LocationID, CustomerGroupID) 
            SELECT @i_LocationID, t.*
            FROM dbo.CSVToTable(@i_CustomerGroupID) t;
    

    您的函数dbo.CSVToTable() 返回多个值(我假设只有一列)。正确的语法是insert . . . select

    请注意,insert . . . values 确实不需要。即使只有常量,也可以使用 insert . . . select

    【讨论】:

      【解决方案2】:
      IF NOT EXISTS (SELECT TOP 1 FROM CustomerGroupLocationMap WHERE LocationID = @i_LocationID AND CustomerGroupID = @i_CustomerGroupID)
      BEGIN
      
          INSERT INTO CustomerGroupLocationMap (LocationID, CustomerGroupID) VALUES (@i_LocationID, (SELECT * FROM dbo.CSVToTable(@i_CustomerGroupID)));
      
      END
      

      【讨论】:

        【解决方案3】:

        您需要重写您的存在查询和插入查询-

        IF NOT EXISTS (SELECT 1 FROM CustomerGroupLocationMap WHERE LocationID = @i_LocationID AND CustomerGroupID IN (SELECT *
            FROM dbo.CSVToTable(@i_CustomerGroupID) ))
        BEGIN
        
            INSERT INTO CustomerGroupLocationMap (LocationID, CustomerGroupID) 
            SELECT @i_LocationID, i.* FROM dbo.CSVToTable(@i_CustomerGroupID) i;
        
        END
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多