Datenbanken
Posts 1-6 of 6
-
Sven RauThe company name is only visible to registered members.stored procedure mehrere Rückgabewerte
Hallo,
ich beschäftige mit seit kurem mit stored procedures. Jetzt habe ich eine procedure geschrieben die über ein SELECT Daten zurückgeben soll. Dazu habe ich einen Output-Parameter gesetzt.
Die Auswertung des SELECT-Befehls ergibt immer mehere Datensätz. Wie kann ich jetzt die Datensätze in den Output-Parameter bekommen.
Im Moment zeigt mir der Output-Parameter immer nur einen Datensatz an. Muss ich das über ein Schleife lösen?
Google hat mir da auch nicht wirklich weiter geholfen.
Bin für jede Anregung dankbar.
Gruß
Sven
CREATE PROCEDURE [dbo].[sp_getTransport_time]
(
@lieferant integer,
@landkz integer,
@gebiet integer,
@zeitraum nchar(20) OUTPUT
)
AS
declare @zeitid integer
BEGIN
SELECT @zeitid = zeitid FROM tblLiefergebiet WHERE lieferantenid = @lieferant AND landid = @landkz AND gebiet = @gebiet;
SELECT @zeitraum = zeitraum FROM tblTransportzeit WHERE zeitraumid = @zeitid;
SELECT (@zeitraum) AS WERT;
END
- 05 Feb 2010, 1:20 pm
-
Christoph Ingenhaag Premium MemberThe company name is only visible to registered members.Re: stored procedure mehrere Rückgabewerte
Hallo Sven,
ich gehe mal davon aus, das MS SQL Server als Datenbanksystem hast...
mit OUTPUT gibst du den Inhalt der so definierten Variable an den Aufrufer zurück.
Ansonsten gibt wird jedes mit einem SELECT erzeugtes Resultset an den Aufrufer zurückgegeben.
Wenn du Variablen mit einem SELECT Statement füllst, wird nur der letzte in diese Variable geschriebene Wert zurückgegen (sofern OUTPUT)
Felder als Variabeln zurückzugeben macht nur dann Sinn, wenn du nur einen Datensatz zurückgibst, da das Füllen und zurückgeben der Variablen weniger Overhead hat, als ein Resultset mit einem Datensatz zu füllen.
Der Aufrufer muss dann den Wert der OUTPUT Variablen eigenen Variabeln zuweisen.
Deine beiden Select Statements verknüpft man zu einem Statement mittels JOIN:
select t.zeitraum
from tblLiefergebiet l
inner join tblTransportzeit t
on
l.zeitid = t.zeitraumid
where
l.lieferantenid = @lieferant and
l.landid = @landkz AND
l.gebiet = @gebiet
GANZ WICHTIG: Benenne Datenbankobjekte wie z.B. Prozeduren NIEMALS mit den Präfix sp_ !!!!
Objekte die so benannt sind werden vom SQL Server immer zuerst in der Master Datenbank gesucht und dann erst in der verbundenen Datenbank. Dies hat Auswirkungen auf die Performance und kann zu Namenskonflikten führen!
Als Optionen solltest du weiterhin
set nocount on --unterdrückt die Ausgabe der Anzahl der betroffenen Datensätze
set xact_abort on -- Wichtig für Fehlerbehandlung von Transaktionen
setzen
und am Ende der Prozedur
mit return einen Wert zurückgeben, der 0 zurückgibt wenn keine Fehler auftritt, und ungleich 0 wenn ein Fehler auftritt.
Zur Fehlerbehandlung schau dir mal BEGIN TRY END TRY BEGIN CATCH END CATCH an.
Das wärs erstmal im Groben...
Als Newsgroup sehr zu empfehlen: microsoft.public.de.sqlserver
Viele Grüße
Christoph
- 05 Feb 2010, 2:08 pm
-
Lukas GradlThe company name is only visible to registered members.Re: stored procedure mehrere Rückgabewerte
Hallo Sven!
Interessant wäre als erstes was du überhaupt für eine Datenbank anwendest.
In FirebirdSQL z.B. müsste eine Stored procedure so aussehen:
CREATE PROCEDURE DemoListe
RETURNS (
Nummer INTEGER,
Text VARCHAR(25)
) AS
BEGIN
FOR SELECT Nr, Name FROM DemoTabelle WHERE DemoFlag=1 INTO :Nummer,:Text
DO SUSPEND;
END
Das entscheidende ist hier das SUSPEND - du musst also eine Procedure schreiben, die in einer Schleife die ganzen Werte ausliest und sie dann mittels SUSPEND eine nach dem anderen hergibt.
Gruß
Luggi
- 05 Feb 2010, 2:13 pm
-
Christoph Ingenhaag Premium MemberThe company name is only visible to registered members.Re^2: stored procedure mehrere Rückgabewerte
Hallo Luggi
Interessant wäre als erstes was du überhaupt für eine Datenbank anwendest.
[dbo].[sp_getTransport_time]
das hier sieht sehr nach MS SQL Server aus. Aber das verwendete Datenbanksystem dazu zu schreiben, ist schon sinnvoll ;-)
Viele Grüße
Christoph
- 05 Feb 2010, 3:02 pm
-
Lukas GradlThe company name is only visible to registered members.Re^3: stored procedure mehrere Rückgabewerte
Hmmm - den Verdacht hatte ich ja schon.
Hier ist aber eine 100% Microsoft-Free Zone - da es MS-SQL für Linux immer noch nicht gibt (warum eigentlich nicht - endlich ein stabiles OS für die Datenbank *breitgrins*) sind meine Kentnisse für MS SQL sehr begrenzt...
Gruß
Luggi
- 05 Feb 2010, 3:18 pm
-
Sven RauThe company name is only visible to registered members.Re^2: stored procedure mehrere Rückgabewerte
Hallo Christoph,
sorry, hätte natürlich dabei schreiben müssen, dass es sich um einen MSSQL-Server handelt.
Vielen Dank schonmal für die Anregung.
Werde ich ausprobieren.
Gruß
Sven
This post was modified on 06 Feb 2010 at 01:26 pm.- 06 Feb 2010, 1:24 pm
