|
| SP kalder SP Fra : Casper Bang |
Dato : 02-01-05 14:14 |
|
Hej,
Jeg har en Stored Procedure i MS SQL Server 2000 som skal kalde en anden
stored procedure (SP).
Men hvordan får jeg fat i resultatet fra den ene SP?
SP1 har til sidst:
SELECT var1 = @var1, var2 = @var2
I SP2 skal jeg kalde SP1 med en parameter, og bruge "var1", som SP1
returnerer som et resultset.
Hvordan gør jeg dette?
Jeg håber i kan hjælpe.
MVH
Casper Bang
| |
Ryan Dahl (03-01-2005)
| Kommentar Fra : Ryan Dahl |
Dato : 03-01-05 05:08 |
|
On Sun, 2 Jan 2005 14:14:27 +0100, "Casper Bang"
<webmaster_fjerndette@fjerndette_secretsofwar.net> wrote:
>Hej,
>
>Jeg har en Stored Procedure i MS SQL Server 2000 som skal kalde en anden
>stored procedure (SP).
>Men hvordan får jeg fat i resultatet fra den ene SP?
>
>SP1 har til sidst:
>SELECT var1 = @var1, var2 = @var2
>
>I SP2 skal jeg kalde SP1 med en parameter, og bruge "var1", som SP1
>returnerer som et resultset.
>Hvordan gør jeg dette?
Hej,
hvis du blot skal have individuelle værdier kan du f.eks. gøre
således:
CREATE PROCEDURE SP2
AS
DECLARE @Antal integer
exec SP1 @Antal OUT
/* Nu skulle @Antal indeholde værdi fra SP1 */
END
CREATE PROCEDURE SP1
@Antal integer OUTPUT
AS
SELECT @Antal = COUNT(*) FROM TABEL1
END
- Det er lige lavet nødtørftigt, så bær over med mig, hvis der har
sneget sig en fejl ind.
mvh
Ryan
| |
Casper Bang (03-01-2005)
| Kommentar Fra : Casper Bang |
Dato : 03-01-05 11:04 |
|
> hvis du blot skal have individuelle værdier
Det skal jeg - blandt andet. Der er også ASP-sider som hiver fat i den
stored procedure, og bruger det resultset den returnerer.
Jeg forstår godt dit eksempel, men kan ikke helt få det til at virke; hvad
når SP1 tager imod parametre, samtidig med at den rent faktisk returnerer
mere end jeg skal bruge?
Jeg prøver at skrive de to SP'er, som de ser ud nu (er mere avancerede, men
for at beskrive det, burde det her være nok):
CREATE PROCEDURE SP2
AS
DECLARE @antal integer
@antal = exec SP1
/* ^Her skal jeg udelukkende bruge variablen "antal", som SP1 blandt andet
returnerer */
SET @antal = @antal * 2
SELECT antal = @antal --eller lignende; den regner på variablen og
returnerer et resultat
GO
CREATE PROCEDURE SP1
@varenr int
AS
DECLARE @antal int
DECLARE @pris int
DECLARE @vaerdi int
SELECT @antal = antal, @pris = pris FROM lager WHERE vnr = @varenr
SET @vaerdi = @antal * @pris
SELECT antal = @antal, pris = @pris, vaerdi = @vaerdi
GO
Jeg håber du ved hvad jeg mener, og har en løsning.
MVH
Casper Bang
| |
Ryan Dahl (03-01-2005)
| Kommentar Fra : Ryan Dahl |
Dato : 03-01-05 14:02 |
|
On Mon, 3 Jan 2005 11:04:13 +0100, "Casper Bang"
<webmaster_fjerndette@fjerndette_secretsofwar.net> wrote:
Jeg tilpasser lige dine SP'ere - jeg garanterer ikke at det er helt
rigtigt - der er ihvertfald ikke testet
Forøvigt - hvis du plejer at programmere i ASP, så tænk på dine stored
procedures som subs med byref-parametre - ikke som functions, der kun
kan returnere én værdi.
mvh
Ryan
CREATE PROCEDURE SP2
@SlutResultat integer OUTPUT
AS
DECLARE @tempAntal integer
exec SP1 @tempAntal OUT
/* Nu skulle vi gerne have modtaget en værdi i @tempAntal */
/* Herefter laves dine beregninger */
SET @tempAntal = @tempAntal * 2
/* Bare lige et hurtigt eksempel */
SELECT @SlutResultat = COUNT(*) FROM TABEL1 WHERE antal = @Antal
END
GO
CREATE PROCEDURE SP1
@Antal integer OUTPUT
AS
DECLARE @antal integer
DECLARE @pris integer
DECLARE @vaerdi integer
SELECT @antal = antal, @pris = pris FROM lager WHERE vnr = @varenr
/* En stak beregninger, hvor antal bliver fundet endeligt. */
SET @vaerdi = @antal * @pris
..
..
..
SET @antal = @antal * @vaerdi
END
GO
| |
Casper Bang (03-01-2005)
| Kommentar Fra : Casper Bang |
Dato : 03-01-05 14:51 |
|
> Forøvigt - hvis du plejer at programmere i ASP, så tænk på dine stored
> procedures som subs med byref-parametre - ikke som functions, der kun
> kan returnere én værdi.
Ok, den er jeg med på.
Nu har jeg bare et relateret problem; i SP 1 har jeg nu i slutningen for
eksempel:
SET @antal = 1 -- en referenceoverførsel, til den anden SP
SELECT antal = @antal, pris = @pris -- bruges af kaldende ASP-programmer
Men tilsyneladende går dette ikke helt; ASP siden får ikke returneret den
SELECT sætning :(
Man kan åbenbart ikke have både call by ref og et returnerende select i
samme SP.
Hvordan løses dette? Skal mine ASP sider på en eller anden måde få
resultatet på en anden måde end ved et recordset (i så fald, hvordan?),
eller er det mine SPs der skal tilføjes noget i?
Mange tak for hjælpen indtil videre. Jeg håber resultatet er ved at være
fundet :)
~Casper
| |
Ryan Dahl (05-01-2005)
| Kommentar Fra : Ryan Dahl |
Dato : 05-01-05 22:48 |
|
On Mon, 3 Jan 2005 14:50:41 +0100, "Casper Bang"
<webmaster_fjerndette@fjerndette_secretsofwar.net> wrote:
>Nu har jeg bare et relateret problem; i SP 1 har jeg nu i slutningen for
>eksempel:
>
>SET @antal = 1 -- en referenceoverførsel, til den anden SP
>SELECT antal = @antal, pris = @pris -- bruges af kaldende ASP-programmer
>
Jeg har lige netop haft samme udfordring, og har nu fundet en
løsning...
I SP2 laver du en temp-tabel, som du henter data fra SP1 ind i,
hvorefter du laver en select på temp-tabellen - logisk ikke
Eksempel følger - dette laves i SP2, der burde ikke være behov for
nogen rettelser i SP1... - du skal dog lige tilpasse med egne
variabler og feltnavne....
/* lav temp-tabel */
create table #dummy (objectid varchar(15), antal integer)
/* Kør SP1 og overfør samtidigt data
insert into #dummy exec SP1 @inputvaerdi
/* hent data fra temp-tabel, så det er tilgængeligt når denne sp'er
bliver kaldt */
select objectid, antal from #dummy
/* slet temp-tabel */
drop table #dummy
Det var det...
mvh
Ryan
| |
Casper Bang (06-01-2005)
| Kommentar Fra : Casper Bang |
Dato : 06-01-05 13:31 |
|
> Det var det...
Det var det nemlig :)
Mange tak for hjælpen Ryan!! Det virker helt perfekt.
| |
|
|