Avatar billede mrpalermo Nybegynder
15. februar 2004 - 21:10 Der er 7 kommentarer og
2 løsninger

#Temp tabeller og Stored Procedure

Hvordan kan jeg benytte en midlertidig table, som jeg opretter på følgende måde:
Jeg er nødt til at oprette tabellen på den måde, da antallet af variabler i tabellen, er forskellig hver gang SP´en bliver afviklet.

Set @TableSQL = @TableSQL + 'CREATE TABLE [Result] (' + char(13)
Set @TableSQL = @TableSQL + '    [Resultvalue] [nvarchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,' + char(13)
Set @TableSQL = @TableSQL + ')

exec sp_executesql @TableSQL

SP´en?? kan ikke se den oprettede tabel. Jeg ved ikke om det er fordi SP´en "sp_executesql" reelt set er ejeren af tabellen der oprettes?
Hvis jeg tilføjer:
Set @TableSQL = @TableSQL + 'select * from Result'
inden exec sp_executesql @TableSQL, så kan man godt se tabellen.

Anyway, håber der sidder et klogt hovede derude som kan hjælpe.

Prøv venligst jeres svar af, inden i begynder at gætte. På forhånd tak.
Avatar billede zedios Nybegynder
15. februar 2004 - 21:18 #1
Dit problem er at #temp er afhængig af den process/forbindelse der opretter den. Når du gør det dynamisk gennem sp_executesql så forsvinder den ud af scope så snart den er oprettet..

Du kunne evt. bruge en global temp tabel i stedet (##temp), men det kan evt. give dig andre problemer hvis fx. du har behov for at have en kopi af tabellen med samme navn liggende flere gange.

Et alternativ kunne derfor være at oprette tabellen manuelt i tempdb prefixet med spid og så slette den når du er færdig. Kan stadig gøres vha. dynamisk SQL.
Avatar billede mrpalermo Nybegynder
15. februar 2004 - 22:39 #2
Det lyder til du har fat i noget af det rigtige. Din konklusion mht. at temp tabellen forsvinder ud af scopet, er også det jeg kom frem til.

Kan du ikke uddybe dit forslag nærmere. Jeg kan lige beskrive den situation som jeg står i:

Min temp-tabel skal retunere en hulens masse beregninger, basseret på nogle inputs. Jeg kan ikke have at 2 brugere kan risikere at få resultatet fra eksakt samme temp tabel retur på samme tid. Jeg ved ikke om dit svar tager højde for det? Idéen med #temp tabellen er netop, at der oprettes en unik #temp tabel for hver enkelt bruger.

Pointene går til dig, hvis du kan gennemskue min problemstilling, og komme med resultatet
Avatar billede mrpalermo Nybegynder
15. februar 2004 - 22:40 #3
Mht.:
Du kunne evt. bruge en global temp tabel i stedet (##temp), men det kan evt. give dig andre problemer hvis fx. du har behov for at have en kopi af tabellen med samme navn liggende flere gange.

Svar til det:
Nej, tabellen skal slettes umiddelbart efter at resultatet bliver selected.
Avatar billede mrpalermo Nybegynder
15. februar 2004 - 23:18 #4
##TEMP virker tilsynladende, men hvor "global" er den? Er den unik for den enkelte bruger? eller vil alle kunne accesse den så længe den er oprettet på serveren?
Avatar billede zedios Nybegynder
16. februar 2004 - 00:22 #5
u##temp er global for alle brugere - så en bruger vil se de samme data som en anden bruger har oprettet!

Mht. unik temp tabel man opretter manuelt så tager et prefix med spid højde for det.

Fx.

declare @strSQL nvarchar(4000)
SELECT @strSQL = 'CREATE TABLE ' +@@SPID+ '_temp (alle dine kolloner her)'
EXEC(strSQL)

Nu har du så en tabel for denne forbindelse der er helt unik (SPID er altid unik) som du kan arbejde videre på.   

Eller ud fra dit eksempel:

Set @TableSQL = @TableSQL + 'CREATE TABLE ['+CAST(@@SPID AS varchar)+'_Result] (' + char(13)
Set @TableSQL = @TableSQL + '    [Resultvalue] [nvarchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,' + char(13)
Set @TableSQL = @TableSQL + ')'

exec sp_executesql @TableSQL
Avatar billede mrpalermo Nybegynder
16. februar 2004 - 09:53 #6
Tak for det, Zedios

Lige et tillægsspørgsmål: Hvordan vil du fortsat arbejde videre med den oprettede tabel? Fx. selecte den for at tage et eksempel?

Dim @MyTab as char
Set @MyTab = cast(@@spid as char) + '_Result'
select * from @MyTab

Ovenstående gider serveren slet ikke høre tale om. Kan du fikse det sidste for mig, så kan jeg komme videre. På forhånd tak.
Avatar billede zedios Nybegynder
16. februar 2004 - 11:08 #7
Du er nødt til at danne udtrykket dynamisk her også:

DECLARE @strSQL nvarchar(4000)
SET @strSQl = 'SELECT * FROM ' +cast(@@spid as char) + '_Result'
EXEC(@strSQL)
Avatar billede mrpalermo Nybegynder
16. februar 2004 - 11:10 #8
Dvs. arbejde i et andet score resten af min SP
Avatar billede mrpalermo Nybegynder
16. februar 2004 - 11:26 #9
Zedios, jeg mangler nogen gange en SQL-haj på et højt plan til at sparre med. Hvis du er på messenger, kan du så ikke tilføje mig på din liste?

Jeg skal nok lade være med at overfuse dig med spg. :o)

Du kan finde mig på: peter.schmidt@interwaregroup.com
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

IT-JOB

KMD A/S

E2E Tester

Politiets Efterretningstjeneste

IT Sikkerhedsarkitekt i PET

Netcompany A/S

Test Consultant

Politiets Efterretningstjeneste

CNE-specialist til PET`s indhentningsafdeling

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Ingeniør til Satellitkommunikation