簡體   English   中英

如何編輯存儲過程?

[英]How can I edit a stored procedure?

我的數據庫中有幾個存儲過程,結構如下:

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

我被要求在每個擁有它的過程中用另一個表替換FROM子句中的表my_table

我研究了很多,但我應該創建一個自己工作的腳本,我還沒有找到任何合適的。 例如,我找到了顯示存儲過程源代碼的sp_helpTetx ,但是有沒有辦法將它放入變量中以便對其進行編輯?

您可以使用像 REDGATE SqlRefactor 這樣完美工作的工具,或者您可以編寫所有存儲過程的腳本,用 ALTER 替換 CREATE 命令,然后在您需要的文本中應用其他 REPLACE ...

我做了很多時間,你必須注意,但它有效......

  1. 查找引用該表的所有存儲過程(您可以使用 SQL Server 中內置的依賴項內容或運行查詢以查找該表名,請參閱SQL Server 中存儲過程中的搜索文本

  2. 用“ALTER”而不是“CREATE”來編寫它們按CTRL-H(查找和替換)

  3. 執行腳本。

這是一篇文章,概述了如何使用游標和上述 sp_HelpText 處理此問題(包括也提到的 set)。

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

如果 sp_HelpText 返回一個表,為什么不使用游標來遍歷結果並將結果字符串連接在一起呢? 這是討厭的,但會做的伎倆。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM