子查询返回了多个值。当子查询跟随时,不允许这样做

时间:2016-03-19 09:38:34

标签: sql-server

我有我的程序,我得到这个错误,有人可以帮忙吗?

create procedure [dbo].[insert_pohead] @entry_no int
as
begin
    declare @VendorID varchar(100);
    declare @userr nvarchar(25);
    declare @podamt decimal(8,2)

    set @podamt = (select SUM(linetotal) as Totalamt 
                   from po_detail 
                   where entry_no = @entry_no)
    set @userr = (select userr 
                  from po_detail 
                  where entry_no = @entry_no)
    set @VendorID = (select VendorID 
                     from po_detail 
                     where entry_no = @entry_no)

    insert into po_head(entry_no, SubTotal, valid, approved, EmployeeID, VendorID)
    values(@entry_no, @podamt, '1', '1', @userr, @VendorID)
end
GO

3 个答案:

答案 0 :(得分:2)

由于填充变量的所有查询都使用where子句中的相同过滤器引用同一个表,因此您可以按如下方式重写过程:

create procedure [dbo].[insert_pohead] @entry_no int
as
begin
    insert into po_head (entry_no, SubTotal, valid, approved, EmployeeID, VendorID)
    select @entry_no, SUM(linetotal) as Totalamt, '1','1', userr, VendorID 
    from po_detail 
    where entry_no=@entry_no
    group by userr, VendorID 
end

答案 1 :(得分:0)

以下查询必须返回一项 - 您可以添加top 1以确保:

set @userr = (select top 1 userr 
                  from po_detail 
                  where entry_no = @entry_no)
set @VendorID = (select top 1 VendorID 
                     from po_detail 
                     where entry_no = @entry_no)

注意:您需要验证这些查询返回的项目是否符合您的要求,如果需要,您可以按部分添加另一个过滤器/顺序,以确保实际返回单行。

答案 2 :(得分:-2)

如果使用SQL Server

 set @userr = (select Top 1 userr 
                  from po_detail 
                  where entry_no = @entry_no)
    set @VendorID = (select Top 1 VendorID 
                     from po_detail 
                     where entry_no = @entry_no)

如果我的SQL

set @userr = (select  userr 
                  from po_detail 
                  where entry_no = @entry_no limit by 1)
    set @VendorID = (select Top 1 VendorID 
                     from po_detail 
                     where entry_no = @entry_no limit by 1)