2016-09-12 13 views
1

Ich bin damit beschäftigt, einige gespeicherte PostgreSQL-Prozeduren/-Funktionen für SQL Server 2014 TSQL neu zu schreiben.TSQL-Prozedur, die mehrere Datenzeilen zurückgibt

Ich habe Mühe, meine Werte von dieser gespeicherten Prozedur obwohl, diese ist nur ein Test, aber ich versuche, mehrere Zeilen von Daten in diesem Fall für die beiden Variablen si_code und co_desc zurückgeben.

Ich habe mein Verfahren wie (als Test) folgt

if (object_id('p_get_serial')) is not null 
    drop procedure p_get_serial 
go 

create procedure p_get_serial(@par01 char(20), @par02 integer) 
as 

    declare 
     @co_num integer, 
     @co_desc char(20), 
     @si_code char(20), 
     @log char(40) 

    declare mycur cursor for 
     select co_num, co_desc 
     from colours 
     where co_num <= @par02 

    open mycur 
    fetch next from mycur into @co_num, 
           @co_desc 

    while @@FETCH_STATUS = 0 
    begin 

     set @si_code = '' 

    select @si_code = si_code 
     from sitems 
     where si_co_num = @co_num 

     set @log = @co_desc + ' ' + @si_code 
     raiserror(@log,0,1) with nowait 

     fetch next from mycur into @co_num, @co_desc 

    end 
    close mycur deallocate mycur 

go 

exec p_get_serial @par01 = 'paramater01', @par02 = 10 

was ist der beste Weg, um meine Ergebnisse zurück zu wissen, dass es mehrere Reihen sein wird?

+0

Sie sollten Ihre Eingabe Tabelle und gewünschte Ausgabe zeigen, es sieht aus wie Sie sollten überhaupt keinen Cursor verwenden (sie sind ein Ansatz des letzten Ausweges). Was ist die Absicht des bedingungslosen Raubüberfalls? –

+0

In diesem Beispiel brauche ich den Cursor nicht, das ist nur ein Test, die reale Prozedur ist zu komplex, um auf einen Cursor zu verzichten – Trent

+0

Sie könnten auch eine Funktion in Erwägung ziehen, die eine Tabelle ausgibt. Aber wenn der SP der einzige Weg ist - erstelle/definiere eine Tabellenvariable und gib das am Ende der SP aus. Auch - in der Regel Cursor sind "schlecht" in SQL-Server (schlechte Gesamtleistung). Wenn Sie einen Weg finden, Cursor zu vermeiden, haben Sie eine bessere Leistung. – ripvlan

Antwort

1

In T-SQL müssen Sie keinen Cursor deklarieren. Nur select, was Sie brauchen, und es wird für die Client-App verfügbar sein.

Cursor ist Oracle/DB2/PostgreSQL usw. Möglichkeit der Rückgabe von Daten. SQL Server benötigt es nicht.

create procedure p 
as 
    select 1 as a 

gibt ein Recordset zurück, das einen Datensatz mit einer Spalte enthält.

create procedure p 
as 
    select 1 as a, 'a' as b 
    union select 2, 'b' 

gibt zwei Zeilen mit jeweils zwei Spalten zurück.

Beispiel einer komplexeren Verarbeitung, bevor sie eine Ergebnismenge:

create procedure p 
as 
begin 
    declare @a int, @b varchar(10) 

    select @a = 1 
    select @b = convert(varchar(10), @a) 

    select @a = @a + 1 

    select @a as a, @b as b -- this will be the resultset returned to the client 
end 
+0

Ich werde nicht in der Lage sein, die Ergebnisse zu erreichen, die ich mit einer einzigen Auswahl brauche, die Prozedur, die ich versuche, ist viel mehr beteiligt – Trent

+0

Sie können Ihre Prozedur so komplex wie Sie möchten, ich zeige Ihnen nur die Technologie Sie muss unter MS SQL verwenden: Ihr endgültiges 'select' gibt die Ergebnismenge an den Client zurück. Jede Verarbeitung, die diesen Datensatz erstellt, liegt ganz bei Ihnen. Aber denken Sie auch daran, dass Sie, wenn Sie keine Ergebnismenge benötigen, auch https://technet.microsoft.com/en-us/library/ms187004%28v=sql.105%29.aspx – ajeh

+0

Das ist genau was Ich brauche einen Haufen Dank – Trent

0

Alles, was Sie tun müssen, ist, nur die Daten speichern für jede Zeile in einer temporären Tabelle oder Tabellenvariable und schreiben Sie einfach eine SELECT-Anweisung am Ende des Stored Procedures. Ihre Frage ist nicht klar, was Sie genau brauchen, Sie haben einen Cursor und While-Schleife, sie scheinen redundant zu sein

Verwandte Themen