Avatar billede petercal Nybegynder
05. august 2002 - 07:01 Der er 3 kommentarer og
1 løsning

Output fra stored procedure til ASP ?

Jeg har en Stored procedure som beregner og gemmer sit output i en #tmp tabel. Hvis jeg kalder sp fra query analyzer virker det fint og jeg får mit recordset tilbage, men hvis jeg kalder sp fra ASP kommer der intet tilbage når jeg bruger #tmp tabellen. Hvis jeg gemmer resultatet i en normal tabel i sp virker det også fra ASP. Men jeg vil helst bruge en #tmp a.h.t flere brugere samtidig.
-- denne virker ikke fra ASP
CREATE PROCEDURE [sp_test]
AS
select * into #tmpresult from table1
select * from #tmpresult
return
-- denne virker fra ASP
CREATE PROCEDURE [sp_test]
AS
select * from table1
return

min ASP
Set Conn = Server.CreateObject ("ADODB.Connection")
Conn.Open min_db_connection

strsql = "exec sp_test" 
set rs = Conn.Execute(StrSQL)
response.write rs.fields.count

kan nogen forklare hvorfor ?
Avatar billede bennytordrup Nybegynder
06. august 2002 - 08:25 #1
Opret den første procedure således:

CREATE PROCEDURE [sp_test]
AS
set nocount on
select * into #tmpresult from table1
set nocount off
select * from #tmpresult
return
Avatar billede bennytordrup Nybegynder
06. august 2002 - 08:30 #2
Og så lige forklaringen.

Den første af dine select statements indeholder to gange select. De returneres begge til det kaldende kode, og desuden returneres information om hvor mange poster, der er berørt af sql-koden. Dette kan ikke altid håndteres simpelt af f.eks. Visual Basic eller ASP.

Det, jeg gør med 'set nocount on' er, at jeg fortæller SQL Serveren, at den skal sk*d* højt og flot på, at der er en klient. Den skal ikke bruge noget output tilbage. Kun det select statement, der skal returnere noget til klienten, skal stå efter en 'set nocount off'.

Om der er yderligere en 'set nocount on' efter den returnerende sql statement, er ligegyldigt. Du kunne godt have lavet en create table #tempresult inden og så efter dit select fra #tempresult have udført en drop table #tempresult. AFAIR bør man ifølge Books Online direkte undgå at lave en select into, da det går ud over performance. Bedre er det at oprette tabellen på forhånd og indsætte med insert ... select.

Ydermere bør du undgå enhver brug af select *, hvis du ikke SKAL bruge samtlige felter i tabellen. Jo flere felter, der skal hentes, jo langsommere.
Avatar billede petercal Nybegynder
07. august 2002 - 06:39 #3
Hej Benny
Tak for svaret, det hjalp at sætte NOCOUNT off. Jeg er godt klar over at SELECT * belaster men i dette tilfælde returneres kun 1 post med 5 felter. Jeg kendte dog ikke til NOCOUNT problematillen.
Hilsen
Peter Calum
Avatar billede jgc Nybegynder
06. september 2002 - 13:12 #4
Hej Benny. Også en stor tak herfra - jeg havde præcis samme problem.

En lille tilføjelse: Eventuelle PRINT-sætninger i sp'en skal også fjernes før det virker.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester