获取 SQL 服务器中存储过程的文本

Get the text of a stored procedure in SQL Server

我正在尝试将一个旧的存储过程保存到一个字符串中。当我使用以下内容时,我没有换行。

SELECT @OldProcedure = Object_definition(object_id)
FROM   sys.procedures
WHERE  name = @ProcedureName

关于如何获取带换行符的存储过程文本有什么建议吗?

我正在考虑使用 sp_helptext

谢谢

更新

我正在复制并粘贴结果中的结果,这将显示一行。

至于脚本,因为我将结果存储在数据库字段中。我正在创建一个可以动态生成程序的工具,但我想创建它们的历史记录。

更新

结果 Object_definition 做了我想要的,但出于某种原因,当我从结果中复制它时,我得到了一行。

Declare @sql varchar(max) ;
SELECT @sql=Object_definition(object_id)
FROM   sys.procedures
WHERE  name = 'Test_QueryBuilder';

drop procedure Test_QueryBuilder
exec( @sql)
print @sql

我强烈建议只使用 SQL Server Management Studio 中的 "Script To" 功能:

我过去在处理像 Stored Procedures.

这样的旧对象时用得很好

我最近遇到了同样的问题,并制作了一个快速而肮脏的脚本来获取视图的定义,但同样的事情也适用于存储过程和函数。

DECLARE @Lines TABLE (Line NVARCHAR(MAX)) ;
DECLARE @FullText NVARCHAR(MAX) = '' ;

INSERT @Lines EXEC sp_helptext 'sp_ProcedureName' ;
SELECT @FullText = @FullText + Line FROM @Lines ; 

PRINT @FullText ;

它只是按照您的建议使用 sp_helptext,在 table 变量中获取其输出并将所有结果行连接到一个文本变量中。它还使用了 sp_helptext 结果集中的每一行都包含尾随换行符的事实,因此无需在此处添加它。

从那时起,您只需像往常一样使用变量、打印它、保存到某些 table 或对其进行一些操作。我的特定用例是构建一个辅助存储过程来删除视图并在修改其底层 tables 时重新创建它。

两种方式:

select name, object_definition(object_id) 
from sys.procedures

select object_name(p.object_id), definition
from sys.sql_modules as m
join sys.procedures as p
   on m.object_id = p.object_id

听起来您想在程序文本每次更改时记录它。您可以使用 DDL Trigger 自动执行此操作。与数据更改时触发的 DML 触发器不同,这些触发器将在数据库更改时触发。

创建一个table来保存审计日志

CREATE TABLE DDLAudit_Procedure_log (event_instance xml);

创建一个触发器来填充审核日志table

CREATE TRIGGER trg__DDLAudit_Procedure
ON DATABASE
FOR
  CREATE_PROCEDURE
 ,ALTER_PROCEDURE
AS
BEGIN
  INSERT DDLAudit_Procedure_log
        (event_instance)
  SELECT EVENTDATA();
END

创建自动生成的过程后,检查日志

SELECT *
FROM DDLAudit_Procedure_log
WHERE event_instance.value('(//ObjectName)[1]','sysname') = 'MyAutoGeneratedProc'
ORDER BY event_instance.value('(//PostTime)[1]','datetime')

这是一个简单的例子。您可以在触发器中检查 EVENTDATA() 的内容以过滤特定的 table。 MSDN 帮助页面有更多详细信息。

推荐“sp_helptext”以获得正确的格式