获取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)为什么?这句话如何符合我的例子?这是正确的(呃)答案,经过编辑以确保正确性。