2016-03-19 8 views
0

Ich habe meine Prozedur und ich bekomme diesen Fehler, kann jemand helfen?Unterabfrage hat mehr als einen Wert zurückgegeben. Dies ist nicht erlaubt, wenn die Unterabfrage

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 
+0

Entweder Ihr 'wählen userr' oder' wählen VendorID' Subqueries scheinen mehr als einen Wert zurück, so dass Sie versuchen, stopfen mehr als einen Wert in eine einzelne Variable. Wie man die Prozedur umschreibt, hängt davon ab, wie die tatsächlichen Daten aussehen. –

+0

mein Ziel ist es, VendorID, userr, Summe von linetotal von po_details Tabelle, wo entry_no übergeben wird, abzurufen und diese in po_head Tabelle über eine Prozedur einzufügen. bitte helfe – Emma

Antwort

2

Da alle Ihre Fragen, die die Variablen füllt verweist auf die gleiche Tabelle, die die gleichen Filter in der where-Klausel sieht es aus wie Sie Ihre Prozedur neu schreiben könnte wie folgt aussehen:

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 [email protected]_no 
    group by userr, VendorID 
end 
0

Die folgenden Abfragen müssen zurückkehren ein Element - Sie können hinzufügen top 1 nur um sicher zu sein:

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) 

Hinweis: Sie müssen Vali Datum, an dem das von diesen Abfragen zurückgegebene Element Ihren Anforderungen entspricht. Bei Bedarf können Sie einen weiteren Filter/eine andere Reihenfolge nach Abschnitt hinzufügen, um sicherzustellen, dass eine einzelne Zeile tatsächlich zurückgegeben wird.

+0

'TOP 1' * ohne * ein' ORDER BY' ist nutzlos - es ist die erste Reihe - aber ** Ordnung nach was ??? ** ..... Du bekommst nur * eine, beliebige * Reihe - normalerweise nicht das, was Sie wollen - normalerweise möchten Sie die Zeilen nach den gleichen Kriterien sortiert bekommen –

+0

Dies ist, wo der Benutzer entscheiden muss. Mir wurde nur das Wissen vermittelt, wie man einen einzelnen Gegenstand auswählt. Ich habe das auch im Hinweis-Abschnitt –

-2

bei Verwendung von 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) 

wenn My 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) 
+1

erwähnt. Diese Antwort ist bereits vorhanden. Sie müssen keine MySql-Antwort angeben, da wir wissen, dass es nicht MySql ist –

Verwandte Themen