05. juni 2001 - 09:24
Der er
12 kommentarer og
1 løsning
cursor fra sp
Jeg kalde en sp (fra en anden server) som returnerer en række recordsets. Resultatet vil jeg gerne ha ind i en cursor. Hvordan foregår det ?
Følgende kan ikke lade sige gøre:
declare labData cursor
for select * from ServerName.sp_Name.dbo.sp_getLabData
fejlmeddelelse:
OLE DB provider \'SQLOLEDB\' does not contain table \'\"sp_Name\".\"dbo\".\"sp_getLabData\"\'.
--Jeg var sikker på at man kunne bruge sp i en cursor declaration, men jeg kan ikke få det til at virke, så ...
CREATE TABLE #tmpFerm
(BatchID nvarchar(50),
TankID nvarchar(50),
Plato float,
Colour float,
CO2 float,
O2 float,
BU float,
AlcVol float,
AlcMass float,
Haze float,
Flav float,
TS nvarchar(25) DEFAULT NULL)
INSERT #tmpFerm
exec sp_BrightBeerGet
--Flav er en bit jeg har bare ikke fået rettet min .asp endnu.
DECLARE @BatchID nvarchar(50),
@TankID nvarchar(50),
@Plato float,
@Colour float,
@CO2 float,
@O2 float,
@BU float,
@AlcVol float,
@AlcMass float,
@Haze float,
@Flav float,
@TS Nvarchar(25)
DECLARE curFerm CURSOR LOCAL FOR SELECT * FROM #tmpFerm
--Der skal være variabler til alle output fields også selv om du ikke bruger dem.
OPEN curFerm
FETCH NEXT FROM curFerm INTO @BatchID, @TankID, @Plato, @Colour, @CO2, @O2, @BU, @AlcVol, @AlcMass, @Haze, @Flav, @TS
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT CAST(@BatchID AS nvarchar) + \' in tank: \' + @TankID
PRINT \' - Plato: \' + CAST(@Plato AS nvarchar)
FETCH NEXT FROM curFerm INTO @BatchID, @TankID, @Plato, @Colour, @CO2, @O2, @BU, @AlcVol, @AlcMass, @Haze, @Flav, @TS
END
CLOSE curFerm
DEALLOCATE curFerm
DROP TABLE #tmpFerm
I lyset af at du skal bruge cursor har jeg lavet sp_***BrightBeerGet om så du kun få de fields du har brug for. Grunden til at vi tog alle i første omgang var at hvis der senere kom nye felter til, så behøvede vi ikke lave sp om hvis du skulle bruge et nyt felt. Når du skal bruge cursor skal du kende felterne i outputtet, da cursoren eller vil fejle, så derfor ændringen. TimeStamp feltet bliver converteret til VarChar(25) i sp på min side.
Jeg laver tilsvarende ændring for Fermenter og Yeast.
05. juni 2001 - 21:25
#10
Nu ved jeg jo ikke hvad du laver i din stp, men hvis du bruger SQL Server 2000 kan du måske anvende en user defined function. Den er ny i SQL Server 2000 og kan returnere en variabel af typen table (ligeledes nu i SQL Server 2K).
Det er dog ikke alt der kan laves i en UDF - SE BOL for mere info - men man kan lave en
SELECT * FROM udfMyUserDefinedFunction
Ved ikke om det hjalp....?
/Sune