Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取SQL Server中存储过程的文本_Sql_Sql Server_Stored Procedures - Fatal编程技术网

获取SQL Server中存储过程的文本

获取SQL Server中存储过程的文本,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我正在尝试将旧存储过程保存到字符串中。当我使用以下命令时,我不会得到任何换行符 SELECT @OldProcedure = Object_definition(object_id) FROM sys.procedures WHERE name = @ProcedureName 关于如何获取带换行符的存储过程文本,有什么建议吗 我正在考虑使用sp\u helptext 谢谢 更新 CREATE TRIGGER trg__DDLAudit_Procedure ON DATABASE FOR

我正在尝试将旧存储过程保存到字符串中。当我使用以下命令时,我不会得到任何换行符

SELECT @OldProcedure = Object_definition(object_id)
FROM   sys.procedures
WHERE  name = @ProcedureName
关于如何获取带换行符的存储过程文本,有什么建议吗

我正在考虑使用
sp\u helptext

谢谢

更新

CREATE TRIGGER trg__DDLAudit_Procedure
ON DATABASE
FOR
  CREATE_PROCEDURE
 ,ALTER_PROCEDURE
AS
BEGIN
  INSERT DDLAudit_Procedure_log
        (event_instance)
  SELECT EVENTDATA();
END
我正在复制和粘贴结果,结果将显示一行

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
至于脚本,我将结果存储在db字段中。我正在创建一个工具来动态生成过程,但我想创建它们的历史记录

更新

CREATE TRIGGER trg__DDLAudit_Procedure
ON DATABASE
FOR
  CREATE_PROCEDURE
 ,ALTER_PROCEDURE
AS
BEGIN
  INSERT DDLAudit_Procedure_log
        (event_instance)
  SELECT EVENTDATA();
END
事实证明,Object_定义符合我的要求,但由于某种原因,当我从结果中复制它时,只得到了一行

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中的“脚本到”功能:


在过去,当处理像
存储过程这样的旧对象时,我曾经很好地使用过它。最近,我遇到了同样的问题,并编写了一个快速而肮脏的脚本来获取视图的定义,但同样的事情也可以用于存储过程和函数

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
结果集中的每一行都包含尾随的新行字符,因此无需在此处添加它

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

两种方法:

select name, object_definition(object_id) 
from sys.procedures


听起来好像每次过程更改时都要记录它的文本。您可以使用一个。与DML触发器不同,DML触发器会在数据更改时触发,而DML触发器会在数据库更改时触发

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

CREATE TABLE DDLAudit_Procedure_log (event_instance xml);
SELECT *
FROM DDLAudit_Procedure_log
WHERE event_instance.value('(//ObjectName)[1]','sysname') = 'MyAutoGeneratedProc'
ORDER BY event_instance.value('(//PostTime)[1]','datetime')
创建触发器以填充审核日志表

CREATE TRIGGER trg__DDLAudit_Procedure
ON DATABASE
FOR
  CREATE_PROCEDURE
 ,ALTER_PROCEDURE
AS
BEGIN
  INSERT DDLAudit_Procedure_log
        (event_instance)
  SELECT EVENTDATA();
END
创建自动生成的过程后,检查日志

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

这是一个简单的例子。您可以检查触发器中的内容以筛选特定表。MSDN帮助页面有更多详细信息。

您如何知道没有换行符?你在SSMS中看到这个吗?如果是这样的话,您只需要将输出设置为文本而不是网格,它将显示格式化的文本。为什么不在SQL Server Management Studio中查看它们,并在“脚本到”文件或查询窗口中查看它们呢?sp_helptext确实是一种方法。您将获得在服务器上编译的过程的确切定义。这听起来像是XY问题。如果希望对数据库对象进行版本控制,有更好的方法@不,可能。基本上,我构建了一些东西来生成一个存储过程。我想保留它生成的所有过程的历史记录。如果属于XY问题,请告诉我。是否保存结果或在新数据库中创建对象?如果您想将DB对象保存在一个表中,您的用例是什么。但是您只需要将DECLARE@NewLineChar添加为CHAR(2)=CHAR(13)+CHAR(10)为什么?这句话如何符合我的例子?这是正确的(呃)答案,经过编辑以确保正确性。