in

UGISS Community

Il sito della community dello User Group Italiano di SQL Server

Local temporary table

Last post 09-25-2008 0.48 by sgovoni. 3 replies.
Page 1 of 1 (4 items)
Sort Posts: Previous Next
  • 08-28-2008 18.55

    • sgovoni
    • Top 10 Contributor
      Male
    • Joined on 10-18-2007
    • Posts 171
    • Points 2.635

    Local temporary table

    Ciao a tutti,

    sono alle prese con una stored procedure in cui vorrei creare ed utilizzare una tabella temporanea locale. Ho scelto una local temporary table perchè:

    • Verrà eliminata automaticamente da SQL Server al termine della stored procedure
    • SQL Server sarà in grado di distinguere le tabelle create da differenti utenti (esecuzioni contemporanee da parte di più utenti)

    Esempio semplificato:

    IF OBJECT_ID('USP_TestTmpTable') IS NOT NULL

      DROP PROCEDURE dbo.USP_TestTmpTable

    GO

     

    CREATE PROCEDURE dbo.USP_TestTmpTable

    AS

    BEGIN

      DECLARE @sSQL varchar(8000), @sTraceFile varchar(255)

      SET @sTraceFile = 'C:\'

      EXEC master..xp_sprintf @sSQL OUTPUT, 'DIR "%s*.*" /ODN /B', @sTraceFile

      EXEC ('CREATE ' + 'TABLE #tmpFiles (f_id int IDENTITY, [filename] varchar(255))')

      INSERT #tmpFiles EXEC master..xp_cmdshell @sSQL

      SELECT f_id, [filename] FROM #tmpFiles

    END

    Purtroppo Sad non posso modificare il comando di creazione della tabella temporanea #tmpFiles: EXEC ('CREATE ' + 'TABLE #tmpFiles (f_id int IDENTITY, [filename] varchar(255))'). La CREATE TABLE deve essere mantenuta all'interno di una stringa... per non piangere non vi sto a spiegare i motivi.

    Se tento di eseguire la stored procedure con EXEC dbo.USP_TestTmpTable ricevo il seguente messaggio di errore:

    Msg 208, Level 16, State 0, Procedure USP_TestTmpTable, Line 18

    Invalid object name '#tmpFiles'.

    La tabella temporanea creata con EXEC(...) non è visibile all'interno di USP_TestTmpTable.

    Utilizzando una tabella temporanea globale la stored procedure viene eseguita correttamente, ma non so se potrò avere problemi nel caso di esecuzioni contemporanee da parte di più utenti. Avevo pensato anche di concatenare il contenuto della variabile @@SPID al nome della tabella temporanea globale...

    Avete qualche consiglio/suggerimento da darmi ?

    Grazie, ciao

    Sergio

    Filed under: ,
    • Post Points: 20
  • 08-29-2008 10.55 In reply to

    Re: Local temporary table

    E se al posto di una tabella temporanea dichiari una variabile di tipo table?
    :D

    Questa una di quelle che uso io...

    DECLARE  @NOMEVARIABILE  TABLE(
                             log_application VARCHAR(255),
                             log_operation   VARCHAR(255),
                             log_note        VARCHAR(max)

    Poi, all'interno della SP, la popolo come fosse una tabella e la uso di conseguenza.

    Alla fine, quando la SP termina, la variabile sparisce :)

    Ciao

    Ale

    • Post Points: 20
  • 08-29-2008 14.14 In reply to

    • sgovoni
    • Top 10 Contributor
      Male
    • Joined on 10-18-2007
    • Posts 171
    • Points 2.635

    Re: Local temporary table

    Ciao Ale,

    ottima idea, con la versione 2000 di SQL Server però non posso eseguire una INSERT EXEC all'interno di una variabile tabella. Quando tento di eseguire l'ALTER PROCEDURE:

    ALTER PROCEDURE dbo.USP_TestTmpTable

    AS

    BEGIN

      DECLARE @sSQL varchar(8000), @sTraceFile varchar(255)

      SET @sTraceFile = 'C:\'

      EXEC master..xp_sprintf @sSQL OUTPUT, 'DIR "%s*.*" /ODN /B', @sTraceFile

      --EXEC ('CREATE ' + 'TABLE #tmpFiles (f_id int IDENTITY, [filename] varchar(255))')

      DECLARE @tmpFiles TABLE([f_id] int IDENTITY, [filename] varchar(255))

      INSERT @tmpFiles EXEC master..xp_cmdshell @sSQL

      SELECT f_id, [filename] FROM @tmpFiles

    END

    Ricevo questo messaggio:

    Msg 197, Level 15, State 1, Procedure USP_TestTmpTable, Line 23

    EXECUTE cannot be used as a source when inserting into a table variable.

    Dovrei mantenere la compatibilità anche con SQL Server 2000... c'è qualche altro workaround ?

    Grazie

    Filed under: ,
    • Post Points: 5
  • 09-25-2008 0.48 In reply to

    • sgovoni
    • Top 10 Contributor
      Male
    • Joined on 10-18-2007
    • Posts 171
    • Points 2.635

    Re: Local temporary table

    Sulla versione 2000 di SQL Server ho risolto utilizzando una tabella temporanea globale. Per rispettare i requisiti di univocità, al nome della tabella ho concatenato il valore di @@SPID.

    Ciao!

    • Post Points: 5
Page 1 of 1 (4 items)
(C) 2007 User Group Italiano di SQL Server