2015-03-10 7 views
7

Ho diversi stored procedure nel mio database, strutturati in questo modo:Come posso modificare una procedura memorizzata?

CREATE PROCEDURE MyProcedure (.....) 
AS 
    DECLARE @myvar NVARCHAR(100); 
    SET @myvar = (SELECT .... FROM my_table WHERE ....) 
GO 

mi fu chiesto di sostituire la tabella my_table nella clausola FROM con un altro uno in ogni procedura che ha.

Ho svolto molte ricerche, ma dovrei creare una sceneggiatura che funzioni da sola e non ho trovato nulla di adatto. Ad esempio ho trovato il sp_helpTetx che mostra il codice sorgente di una procedura memorizzata, ma c'è un modo per inserirlo in una variabile per modificarlo?

+0

ci sono strumenti di refactoring gratuiti per SSMS che possono 'smart' rinominare my_table, ad esempio. per esempio. ApexSQL. – g2server

risposta

-2

Se sp_HelpText restituisce una tabella, perché non si utilizza un cursore per scorrere i risultati e unire le stringhe risultanti insieme? È brutto, ma farebbe il trucco.

+1

Facendo 'EXEC sp_HelpText 'MyProcedure'' mostrerà il codice sorgente della procedura, nessuna tabella viene creata – Phate01

+1

Scuse - Intendevo un insieme di risultati piuttosto che una tabella. –

0
  1. Trova tutte le stored procedure con un riferimento a quel tavolo (è possibile utilizzare la roba dipendenze integrato in SQL Server o eseguire una query alla ricerca di quel nome della tabella vedere Search text in stored procedure in SQL Server)

  2. Script fuori con un "ALTER" invece di "CREATE" Premere CTRL-H (trova e sostituisci)

  3. Eseguire lo script.

+0

Lo script dovrebbe essere dinamico, perché se aggiungessi una nuova procedura dovrei modificare anche lo scritpt – Phate01

+1

Benvenuto nello sviluppo del database – Jeremy

+0

Inoltre, se hai aggiunto una nuova procedura, avresti il ​​nome corretto della tabella. .destra? – Jeremy

0

Ecco un articolo che illustra come gestire questo utilizzando un cursore, e la sp_helptext come menzionato sopra (compresi impostato come anche menzionato).

http://www.ideosity.com/ourblog/post/ideosphere-blog/2013/06/14/how-to-find-and-replace-text-in-all-stored-procedures

-- set "Result to Text" mode by pressing Ctrl+T 
SET NOCOUNT ON 

DECLARE @sqlToRun VARCHAR(1000), @searchFor VARCHAR(100), @replaceWith  VARCHAR(100) 

-- text to search for 
SET @searchFor = '[MY-SERVER]' 
-- text to replace with 
SET @replaceWith = '[MY-SERVER2]' 

-- this will hold stored procedures text 
DECLARE @temp TABLE (spText VARCHAR(MAX)) 

DECLARE curHelp CURSOR FAST_FORWARD 
FOR 
-- get text of all stored procedures that contain search string 
-- I am using custom escape character here since i need to espape [ and ] in  search string 
SELECT DISTINCT 'sp_helptext  '''+OBJECT_SCHEMA_NAME(id)+'.'+OBJECT_NAME(id)+''' ' 
FROM syscomments WHERE TEXT LIKE '%' +  REPLACE(REPLACE(@searchFor,']','\]'),'[','\[') + '%' ESCAPE '\' 
ORDER BY 'sp_helptext '''+OBJECT_SCHEMA_NAME(id)+'.'+OBJECT_NAME(id)+''' ' 

OPEN curHelp 

FETCH next FROM curHelp INTO @sqlToRun 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    --insert stored procedure text into a temporary table 
    INSERT INTO @temp 
    EXEC (@sqlToRun) 

    -- add GO after each stored procedure 
    INSERT INTO @temp 
    VALUES ('GO') 

    FETCH next FROM curHelp INTO @sqlToRun 
END 

CLOSE curHelp 
DEALLOCATE curHelp 

-- find and replace search string in stored procedures 
-- also replace CREATE PROCEDURE with ALTER PROCEDURE 
UPDATE @temp 
SET spText = REPLACE(REPLACE(spText,'CREATE PROCEDURE', 'ALTER  PROCEDURE'),@searchFor,@replaceWith) 

SELECT spText FROM @temp 
-- now copy and paste result into new window 
-- then make sure everything looks good and run 
GO 
1

È possibile utilizzare lo strumento come REDGATE SqlRefactor che funziona perfettamente o si può script di tutte le stored procedure, sostituire CREATE comando con ALTER e quindi applicare l'altra REPLACE nel testo è necessario ...

Lo faccio molto tempo, devi prestare attenzione ma funziona ...