Avatar billede dm013 Nybegynder
19. april 2004 - 01:45 Der er 9 kommentarer og
1 løsning

Problem med insert til temptabel

Hej eksperter
I min AccessFrontend har jeg en listbox hvor multi select er aktiveret, default, er alle valgt, hvor je så sender '-1;' som parameter ellers sendes de valgte typer f.eks: '22;23;56;'

Nu vil jeg så gerne i min stored procedure kunne afgøre hvilke parametre der anvendes, dertil har jeg lavet nedenstående Stored Procedure, men når jeg vil gemme den får jeg følgende besked
"ADO error: There is already an object named #tempfrasted in the database",

Hvad gør jeg ???
Alter Procedure LP1
    (
    @Fsted nvarchar(2000) --Frastedsvariabel
    )
As
declare @T nvarchar(3) --Tempvariabel
declare @T1 int --Tempvariabel
--sæt @T= 3 førstetegn i @Fsted
SET @T= left(@Fsted,3)
--Hvis @T er lig -1; hent alle frasteder ind i #t
if @T='-1;'
begin
    set nocount on
    select frastednr
    into #tempfrasted
    from tblrutedata_kgk
    --where (not(frastednr is null))
    group by frastednr
    order by frastednr
end

else
if @T <>'-1;'
--Hent Valgte frasteder ind i #t

begin
    set nocount on
    create table #temp (Frasteder varchar(50))
    While len(@Fsted)>0 begin
    set @T1=charindex(';',@Fsted)
    insert into #temp  values(substring(@Fsted,1,@T1-1))
    set @Fsted = right(@Fsted,len(@Fsted)-@T1)
--hent data for valgte frasteder
Declare @Frasted varchar(50)
DECLARE FrastedsCursor CURSOR FOR (SELECT Frasteder FROM #temp)
OPEN FrastedsCursor
FETCH Next FROM  FrastedsCursor into @Frasted
WHILE @@Fetch_status = 0
BEGIN
select frastednr
    into #tempfrasted
    from tblrutedata_kgk
WHERE    frastednr = @Frasted 
FETCH Next FROM  FrastedsCursor into @Frasted
END
CLOSE FrastedsCursor
DEALLOCATE FrastedsCursor
end
end
set nocount off
select * from #tempfrasted
return
Avatar billede trer Nybegynder
19. april 2004 - 09:11 #1
Ændr dine #tabeller til tabel-variabler - så har du bedre performance og løst dit problem

Du skal blot oprette dem således

declare @variabel(
  kolonne datatype,
  kolonne datatype,
  ,,,,
)

i stedet for med en SELECT INTO

Uden at have analyzeret meget på hvad du laver; Du kan få væsentligt bedre performance ved ikke at bruge cursors og så mange loops:

create Procedure LP1
    (
    @Fsted nvarchar(2000) --Frastedsvariabel
    )
As
declare @tempfrasted (
  ... tabel-def ...
)

declare @T nvarchar(3) --Tempvariabel
declare @T1 int --Tempvariabel
--sæt @T= 3 førstetegn i @Fsted
set @T= left(@Fsted,3)
set nocount on
if @T='-1;' begin
    -- alle frasteder
    select frastednr
    into @tempfrasted
    from tblrutedata_kgk
    --where (not(frastednr is null))
    group by frastednr
    order by frastednr
end else begin
  -- Valgte frasteder
  while (len(fsted)>0) do begin
    set @t1=charindex(';',@fsted)
    insert into @tempfrasted
    select frastednr from tblrutedata_kgk
    where frastednr = substring(@Fsted,1,@T1-1))
    set @Fsted = right(@Fsted,len(@Fsted)-@T1)
  end
end
select * from @tempfrasted
go
Avatar billede dm013 Nybegynder
19. april 2004 - 09:18 #2
hej Trer, jeg har en formular (MS Access) med 9 listbokse, hvorfra mine kriterier kommer, jeg lytter gerne til forslag til optimering af min performance
Avatar billede trer Nybegynder
19. april 2004 - 09:20 #3
En hurtig optimering (ganske utestet) står nederst i mit indlæg :-)  Og sørg i øvrigt for, at der er indeks på frastednr
Avatar billede dm013 Nybegynder
19. april 2004 - 10:29 #4
den fanger ikke ikke at jeg declare min Tempfrasted tabel

create Procedure LP2
(
@Fsted nvarchar(2000) --Frastedsvariabel
)
As
--Tempvariabeler

declare @tempfrasted (frastedsnr nvarchar(50))
declare @T nvarchar(50)
declare @T1 int

--sæt @T= 3 førstetegn i @Fsted

set @T= left(@Fsted,3)
set nocount on
if @T='-1;'
begin

-- alle frasteder

select frastednr
into @tempfrasted
from tblrutedata_kgk
group by frastednr
order by frastednr

end
set nocount off
select * from @tempfrasted
return
Avatar billede trer Nybegynder
19. april 2004 - 13:22 #5
declare @t table (bla bla)
Avatar billede dm013 Nybegynder
19. april 2004 - 14:09 #6
ahh ja  *gg*
Avatar billede dm013 Nybegynder
19. april 2004 - 15:56 #7
den bliver s.. ved med at brokke sig...

nu er det denne linie den brokker sig over "into @tempfrasted"
create Procedure dbo.LP2

(
@Fsted nvarchar(2000) --Frastedsvariabel
)
As

--Tempvariabeler

declare @tempfrasted table (frastedsnr varchar(50))
declare @T nvarchar(50)
declare @T1 int

--sæt @T= 3 førstetegn i @Fsted

set @T= left(@Fsted,3)
set nocount on
if @T='-1;'
begin

-- alle frasteder
--declare @tempfrasted (frastedsnr varchar(50))
select frastednr
into @tempfrasted
from tblrutedata_kgk
group by frastednr
order by frastednr

end
set nocount off
select * from @tempfrasted
return

GO
Avatar billede trer Nybegynder
19. april 2004 - 16:31 #8
Naturligvis - min bøf: Det skal istedet være

insert into @tempfrasted
select distinct frastednr
from tblrutedata_kgk
order by frastednr

da @tempfrasted variablen jo allerede findes ( og i øvrigt ikke kan oprettes med en SELECT INTO )

Bemærk at jeg har fjernet GROUP BY og indsat en DISTINCT i stedet. Det er lidt renere SQL at skrive således - omend jeg ikke tror det giver bedre performance
Avatar billede trer Nybegynder
19. april 2004 - 16:32 #9
I øvrigt - du behøver ikke at sætte NOCOUNT OFF - det sker automatisk når du forlader SP'en - og du behøver heller ikke at skrive RETURN
Avatar billede dm013 Nybegynder
19. april 2004 - 16:49 #10
mange tak for hjælpen....
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