【问题标题】:Get the text of a stored procedure in SQL Server获取 SQL Server 中存储过程的文本
【发布时间】:2015-05-15 19:01:55
【问题描述】:

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

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

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

我正在考虑使用sp_helptext

谢谢

更新

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

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

更新

原来 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

【问题讨论】:

  • 你怎么知道没有换行符?您是否在 SSMS 中查看此内容?如果是这样,您只需将输出设置为文本而不是网格,它将显示格式化文本。
  • 为什么不在 SQL Server Management Studio 和“脚本到”文件或查询窗口中查看它们?
  • sp_helptext 确实是要走的路。您将获得您的过程的确切定义,因为它已经/将在服务器上编译。
  • 这听起来像是一个 XY 问题。如果您想对数据库对象进行版本控制,有更好的方法。 meta.stackexchange.com/questions/66377/what-is-the-xy-problem
  • @Anon。它可能。基本上我构建了一些东西来生成一个存储过程。我想保留它生成的所有程序的历史。让我知道这是否属于 XY 问题。

标签: sql sql-server stored-procedures


【解决方案1】:

两种方式:

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

【讨论】:

  • 这是正确的(呃)答案,为正确起见而编辑。
【解决方案2】:

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

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,在表变量中获取其输出并将所有结果行连接到文本变量中。它还利用sp_helptext 结果集中的每一行都包含尾随换行符这一事实,因此无需在此处添加。

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

【讨论】:

  • 那行得通。但是你只需要添加 DECLARE @NewLineChar AS CHAR(2) = CHAR(13) + CHAR(10)
  • 为什么?这条线如何适合我的示例?
【解决方案3】:

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

过去,在处理像 Stored Procedures 这样的旧对象时,我已经很好地使用了它。

【讨论】:

  • 保存结果还是在新数据库中创建对象?如果要将数据库对象保存在表中,您的用例是什么?
  • 是的。这绝对有效。在这种情况下,我正在自动化一些东西。
【解决方案4】:

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

创建一个表来保存审核日志

CREATE TABLE DDLAudit_Procedure_log (event_instance xml);

创建触发器以填充审核日志表

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() 的内容以筛选特定表。 MSDN 帮助页面有更多详细信息。

【讨论】:

    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多