Returneret data fra stored procedure ?
Jeg har et problem med data returneret fra en stored procedure. Jeg bruger proceduren til at udføre en helt speciel sortering og det virker fint. Jeg har dogkonstateret at hvis der returneres store datamængder kan der gå kludder i sorteringen. Er nogen her bekendt med om der er begrænsninger i f.eks brugen af temp tabeller og cursors ?
Feltet [ORGDATA] [varchar] (2048)indeholder fra 300-1500 bytes og det er når der er mange data i dette delt at det går galt.
Har nogen en ide ?
proceduren sorterer i dato/tid men samler records med samme CID
CREATE PROCEDURE RapportF1
@monb VARCHAR(28), -- fnummer
@sdate VARCHAR(6), -- startdato
@stime VARCHAR(6), -- starttid
@edate VARCHAR(6), -- slutdato
@etime VARCHAR(6), -- sluttid
@raptype INT, -- raptype
@SpA VARCHAR(28), -- speciel søgning1
@SpB VARCHAR(28) -- speciel søgning2
AS
DECLARE @cid1 VARCHAR(8),
@SQLStatement NVARCHAR(255)
CREATE TABLE [dbo].[#tmpresult] (
[UID] [int] IDENTITY (1, 1) NOT NULL,
[NE] [char] (2) ,
[DATO] [char] (6) ,
[TID] [char] (6) ,
[MONB] [varchar] (28) ,
[CID] [varchar] (14) ,
[CTYPE] [varchar] (10) ,
[CTR] [varchar] (10) ,
[IROUTE] [varchar] (8) ,
[OROUTE] [varchar] (8) ,
[FC] [char] (2) ,
[ANB] [varchar] (28) ,
[BNB] [varchar] (28) ,
[OCN] [varchar] (28) ,
[RDN] [varchar] (28) ,
[RDN1] [varchar] (28) ,
[CBN] [varchar] (28) ,
[ACAT] [char] (2) ,
[EOS] [varchar] (5) ,
[TMR] [char] (2) ,
[ENQ] [varchar] (3) ,
[CAW] [varchar] (3) ,
[DEV] [varchar] (15) ,
[MCNB] [varchar] (28) ,
[RCODE] [varchar] (3) ,
[CAU] [varchar] (40) ,
[INFO] [varchar] (40),
[SQLTIME] [varchar] (20),
[HOSTID] [varchar] (16) ,
[ORGDATA] [varchar] (2048) ) ON [PRIMARY]
-- UID er vigtig for at kunne sortere til sidst --
--lokale #temp tabeller slettes automatisk og kan håndtere flere brugere samtidig
SET NOCOUNT ON
-- hent de records som rapporten skal indeholde
-- og gem dem i en midlertidig tabel
SELECT * INTO #tmptable1 FROM li_data
WHERE MONB=@monb AND (DATO >= @sdate AND TID >= @stime)
AND (DATO <= @edate AND TID <= @etime)
ORDER BY DATO,TID
-- opret cursor og hent alle CID der skal sorteres efter men uden dubletter
-- hvis der er speciel søgning på skal kun
-- de CID der hører til disse med
IF (@spA > '') AND (@spB = '')
-- speciel søgning1
SET @SQLStatement = 'DECLARE Cursor1 CURSOR FOR SELECT DISTINCT CID FROM #tmptable1 WHERE ANB ='+@spA
IF (@spA = '') AND (@spB > '')
-- speciel søgning2
SET @SQLStatement = 'DECLARE Cursor1 CURSOR FOR SELECT DISTINCT CID FROM #tmptable1 WHERE BNB ='+@spB
IF (@spA > '') AND (@spB > '')
-- speciel søgning på A og B nummer
SET @SQLStatement = 'DECLARE Cursor1 CURSOR FOR SELECT DISTINCT CID FROM #tmptable1 WHERE ANB ='+@spA+' AND BNB='+@spB
IF (@spA = '') AND (@spB = '')
-- normal søgning
SET @SQLStatement = 'DECLARE Cursor1 CURSOR FOR SELECT DISTINCT CID FROM #tmptable1'
-- udfør SQL
EXECUTE sp_executesql @SQLStatement
-- åbner recordsættet
OPEN Cursor1
-- hent første post
FETCH NEXT FROM Cursor1 INTO @CID1
-- vælg alle poster med denne CID og gem i resultat tabellen
INSERT INTO #tmpresult
SELECT * FROM #tmptable1 WHERE CID=@cid1
-- læs alle CID igennem
WHILE @@FETCH_STATUS = 0
BEGIN --loop
-- hent næste post
FETCH NEXT FROM Cursor1 INTO @CID1
-- nødvendig break, ellers vises sidste post 2 gange
IF @@FETCH_STATUS = -1
BREAK
-- vælg alle poster med denne CID og gem i resultat tabellen
INSERT INTO #tmpresult
SELECT * FROM #tmptable1 WHERE CID=@cid1
END
CLOSE Cursor1
DEALLOCATE Cursor1
-- her bestemmer rapporttypen hvilke felter der skal returneres
IF @raptype = 1 SELECT DATO,TID,MONB,CTYPE,ANB,BNB,OCN,RDN,RDN1,ENQ,CAW,FC,MCNB,NE,CID,ORGDATA,HOSTID,SQLTIME FROM #tmpresult
ORDER BY UID
IF @raptype = 2 SELECT DATO,TID,MONB,CTYPE,ANB,BNB,OCN,RDN,RDN1,CBN,ENQ,CAW,FC,ACAT,MCNB,RCODE,IROUTE,OROUTE,NE,CID,
CTR,DEV,TMR,EOS,CAU,ORGDATA,HOSTID,SQLTIME FROM #tmpresult ORDER BY UID
RETURN
GO
