![](/img/trans.png)
[英]how can i run a where Clause to stored Procedure without edit it in SQL Server?
[英]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 ...
我做了很多時間,你必須注意,但它有效......
查找引用該表的所有存儲過程(您可以使用 SQL Server 中內置的依賴項內容或運行查詢以查找該表名,請參閱SQL Server 中存儲過程中的搜索文本)
用“ALTER”而不是“CREATE”來編寫它們按CTRL-H(查找和替換)
執行腳本。
這是一篇文章,概述了如何使用游標和上述 sp_HelpText 處理此問題(包括也提到的 set)。
-- 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.