none
Creare dinamicamente query in SP RRS feed

  • Domanda

  • Devo creare dinamicamente all'interno di una stored procedure una query del genere ed eseguirla:

    INSERT INTO TABELLAX ( ID_ANAGRAFICA, COLONNA1, COLONNA5 )
        SELECT ID_ANAGRAFICA, COLONNA1, COLONNAP AS COLONNA5 FROM TABELLA2
       
    La SELECT (SELECT ID_ANAGRAFICA, COLONNA1, COLONNAP AS COLONNA5 FROM TABELLA2), che costituisce la fonte dati, è all'interno di un'altra tabella ed è variabile ed anche la tabella di destinazione della INSERT risiede in un campo di una tabella (TABELLAX).

    Avevo pensato di crearmi un cursore a partire dalla query letta e poi in qualche modo rileggermi le colonne del cursore per concatenare e crearmi la INSERT e poi appenderci la query iniziale.

    La mia difficoltà sta nel leggere all'interno di una Stored Procedure le colonne di un cursore.

    Spero di essere stato chiaro.
    Potreste indicarmi come fare?
    Grazie 1000




    • Modificato Antony4You martedì 27 settembre 2011 11:39
    martedì 27 settembre 2011 11:34

Tutte le risposte

  • Ciao,

    puoi provare ad eseguire la query "sorgente" modificandola in modo da mettere il risultato su una tabella temporanea e da questa leggere la struttura dei campi e comporre la query. Senza usare cursori...

    Ti riporto qui sotto un esempio:

    USE tempdb;
    
    DECLARE @QueryToExecute nvarchar(2000),
        @DataSourceQuery nvarchar(2000),
        @TempTableQuery nvarchar(2000),
        @DestinationTable nvarchar(255),
        @v_FieldList NVARCHAR(2000);
    
    
    -- Leggo dalla tabella la query da eseguire e la tabella di destinazione e metto i rispettivi valori in due variabili  
    SELECT @DataSourceQuery = query, @DestinationTable = Tabella FROM dbo.Queries;
    
    -- Aggiungo "TOP 1" e "INTO ##mybtl" alla query originale, così eseguendola crea una tabella temporanea globale 
    -- dalla quale posso attingere per leggere i nomi dei campi
    SELECT @TempTableQuery = REPLACE(REPLACE(@DataSourceQuery, 'SELECT', 'SELECT TOP 1'), 'FROM', 'INTO ##mytbl FROM');
    
    -- Debug: stampo le due query
    PRINT @DataSourceQuery;
    PRINT @TempTableQuery;
    
    -- Eseguo la query "modificata" creando la tabella temporanea con un solo record
    EXECUTE sp_executesql @TempTableQuery;
    
    -- Estraggo dalla tabella temporanea la lista dei campi e compongo la query di inserimento
    SELECT @v_FieldList = COALESCE(@v_FieldList + ',','') + column_name
    FROM (
                SELECT name AS column_name
                FROM sys.columns
                WHERE object_id = OBJECT_ID('##mytbl')
    ) AS A;
    
    SET @QueryToExecute = 'INSERT INTO ' + @DestinationTable + ' (' + @v_FieldList + ') ' + @DataSourceQuery;
    
    -- Debug: stampo la query di inserimento
    PRINT @QueryToExecute;
    
    -- Elimino la tabella temporanea
    DROP TABLE ##mytbl;
    


    La tabella ##mytbl è una tabella temporanea globale (qui trovi maggiori info nella sezione Temporary Tables), una tabella cioè visibile ed accessibile da tutti gli utenti connessi a SQL Server e quindi non utilizzabile contemporaneamente da più utenti per la stessa funzione.
    Perciò se questo codice deve essere eseguito contemporaneamente devi cambiare il nome della tabella temporanea aggiungendo ad esempio il nome utente (Es. ##mytbl_user01) o con altre tecniche per rendere il nome univoco (es. usando un GUID).

    HTH

    Danilo Dominici MCP MCDBA MCITP MCSE MCAD Questo post è fornito "così com'è". Non conferisce garanzie o diritti di alcun tipo. Ricorda di usare la funzione "segna come risposta" per i post che ti hanno aiutato a risolvere il problema e "deseleziona come risposta" quando le risposte segnate non sono effettivamente utili. Questo è particolarmente utile per altri utenti che leggono il thread, alla ricerca di soluzioni a problemi similari. ENG: This posting is provided "AS IS" with no warranties, and confers no rights. Please remember to click "Mark as Answer" on the post that helps you, and to click "Unmark as Answer" if a marked post does not actually answer your question. This can be beneficial to other community members reading the thread.
    mercoledì 5 ottobre 2011 07:17