2015-03-10 19 views
7

Mam kilka procedur przechowywanych w mojej bazy danych o strukturze tak:Jak mogę edytować procedurę przechowywaną?

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

poproszono mnie zastąpić tabelę my_table w klauzuli FROM z innym w każdej procedurze, która ma go.

Przeszedłem wiele badań, ale powinienem stworzyć skrypt, który działa sam i nie znalazłem nic odpowiedniego. Na przykład znalazłem sp_helpTetx, który pokazuje kod źródłowy procedury przechowywanej, ale czy istnieje sposób na umieszczenie go w zmiennej w celu jej edycji?

+0

dostępne są darmowe narzędzia do refaktoryzacji SSMS, które mogą "inteligentnie" zmienić nazwę my_table, na przykład. na przykład. apexsql. – g2server

Odpowiedz

-2

Jeśli sp_HelpText zwraca tabelę, dlaczego nie użyć kursora, aby zapętlić wyniki i połączyć wynikowe ciągi razem? To paskudne, ale wystarczyłoby.

+1

Wykonywanie 'EXEC sp_HelpText 'MyProcedure'' wyświetli kod źródłowy procedury, nie utworzono tabeli – Phate01

+1

Przeprosiny - Miałem na myśli zestaw wyników, a nie tabelę. –

0
  1. Znajdź wszystkie procedury przechowywane z odniesieniem do tej tabeli (można użyć rzeczy zależności wbudowane w SQL Server lub uruchomić zapytanie szuka tej nazwy tabeli zobaczyć Search text in stored procedure in SQL Server)

  2. Script je z "ALTER" zamiast "CREATE" Naciśnij CTRL-H (znajdź i zamień)

  3. Wykonaj skrypt.

+0

Skrypt powinien być dynamiczny, ponieważ gdybym dodał nową procedurę, musiałbym edytować także scritpt – Phate01

+1

Witamy w tworzeniu bazy danych – Jeremy

+0

Ponadto, jeśli dodałeś nową procedurę, będziesz miał w niej odpowiednią nazwę tabeli. .dobrze? – Jeremy

0

Oto artykuł opisujący, jak sobie z tym poradzić za pomocą kursora, a sp_HelpText, jak wspomniano powyżej (w tym zestaw, jak również wspomniano).

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

Można użyć narzędzia takie jak RedGate SqlRefactor który działa doskonale i można wszystkie procedury przechowywane skrypcie zastąpić komendę CREATE z ALTER a następnie zastosować drugiej REPLACE w tekście trzeba ...

Robię to dużo czasu, trzeba uważać, ale działa ...

Powiązane problemy