获取 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”以获得正确的格式
我正在尝试将一个旧的存储过程保存到一个字符串中。当我使用以下内容时,我没有换行。
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”以获得正确的格式