当前位置: 首页 > 知识库问答 >
问题:

如何编辑存储过程?

史修谨
2023-03-14

我的数据库中有几个存储过程,结构如下:

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

我被要求在每个有它的过程中用另一个子句替换my_table中的表。

我经过了很多研究,但我应该创建一个自己工作的脚本,我还没有找到合适的东西。例如,我找到了显示存储过程源代码的sp_helpTetx,但是有没有办法将其放入变量中以便编辑它?

共有3个答案

呼延聪
2023-03-14

下面是一篇文章,概述了如何使用光标和上面提到的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
王君墨
2023-03-14

>

  • 查找引用该表的所有存储过程(您可以使用SQL Server内置的依赖项,也可以运行查询以查找该表名,请参阅SQL Server中存储过程中的搜索文本)

    用“ALTER”而不是“CREATE”来编写脚本,然后按CTRL-H(查找并替换)

    执行脚本。

  • 赫连照
    2023-03-14

    您可以使用像REDGATE SqlRefactor这样的工具,它可以完美地工作,也可以编写所有存储过程的脚本,用ALTER替换CREATE命令,然后在需要的文本中应用另一个替换。。。

    我做了很多次,你必须注意,但它的工作。。。

     类似资料:
    • 问题内容: 我正在学习如何编写存储过程。我知道了,但我没有。我知道事情是这样的。 因此,我被困住了,我试图理解的是。编写一个存储过程,该过程接受一个Territory ID,Territory Description和Region ID,并将它们作为新行插入Northwind的Territories表中。 好吧,我知道我可以做这样的事情,我相信: 但是那我可能是错的。但我不知道在哪里插入然后作为表

    • 我有两个组件Display.jsx和DisplayList.jsx。组件协同工作以显示本地存储中的值。问题在于DisplayList.JSX handleEdit()方法切片。 Github项目 我的想法: 我在这个论坛上问如何删除本地存储值,得到了这个答案,没有解释:堆栈溢出问题 它可以工作,但现在我需要做类似的切片来编辑旧的存储值并用新的存储值替换。但是我不知道怎么做。 总结:在方法handl

    • 问题内容: 我有一个需要很多参数的插入存储过程-其中2个是@ FirstName,@ LastName。我还有一个更新存储过程,该过程需要许多参数-其中2个是@ FirstName,@ LastName。 我想做的是,从插入SP内部完成之后,调用更新SP并将其发送给@ FirstName,@ LastName。 我不知道这样做的正确语法;我试过了: 但我认为这是错误的。 有人可以告诉我怎么写这个电

    • 问题内容: 我希望能够使用创建存储过程,以后再通过php使用它。 但是我不知道该怎么办? 据我了解,我发现我们无法通过来管理存储过程。 还有什么其他工具可以管理存储过程? 我什至不确定通过PHP使用存储过程是否是更好的选择。 有什么建议吗? 问题答案: 由于使用查询创建,更改和删除了存储过程,因此您实际上可以使用phpMyAdmin对其进行管理。 要创建存储过程,可以使用以下命令(必要时进行更改)

    • 使用laravel 7/livewire应用程序,我使用Repository制作crud,并获得了数据列表,在装载事件中,我分配了受保护的var$FacilityRepository,它在render方法中正常工作, 但在编辑方法中为空,我得到错误: 当用户单击“编辑链接”时 在模板中,编辑链接定义为: 为什么会出现错误以及如何修复? 修改#2: > 类设施扩展组件{...公共$FacilityR

    • 问题内容: 我当前用于调试存储过程的过程非常简单。我创建一个名为“ debug”的表,在其中运行时从存储过程中插入变量值。这使我可以在脚本中的给定位置查看任何变量的值,但是是否有更好的方法来调试MySQL存储过程? 问题答案: 我做的事情和你很相似。 通常,我将包含一个默认为false的DEBUG参数,并且可以在运行时将其设置为true。然后将调试语句包装到“ If DEBUG”块中。 我还将日志