如何在 SQL Server 中仅获取存储过程主体

问题描述 投票:0回答:3

在处理数据库文档主题时,我遇到了一种情况并陷入困境。预先感谢您的潜在帮助。事实如下:

  • 我正在尝试仅获取数据库中某些存储过程的主体。
  • 其他任何东西,例如 SP 参数或选项 - 我不需要。
  • Google 搜索了一下,我发现的只是获取整个 SP 文本的方法 - 其中大多数都是已知的。
  • 我已经整理了一个解决方案,如下所示,但它并没有涵盖所有情况,而且不太漂亮。
定义了此测试 SP:

CREATE PROCEDURE dbo.returnDay @addTheseDays SMALLINT = 0 AS -- This is just a test SP that retrieves -- the current date if @addTheseDays isn't defined, -- otherwise the current day + @addTheseDays SELECT GETDATE() + @addTheseDays; GO

什么没有帮助:

-- This doesn't help since it retrieves all SP text (including parameters and options part) EXEC sp_helptext 'dbo.returnDay'; -- The ROUTINE_DEFINITION column also holds the entire SP text. SELECT * FROM INFORMATION_SCHEMA.ROUTINES;

我已经完成并有效的解决方法,但有例外:

DECLARE @spText VARCHAR(MAX) SELECT @spText = object_definition(object_id('dbo.returnDay')) SELECT SUBSTRING(@spText, CHARINDEX('AS', @spText, 0) + 2 , LEN(@spText)) AS spBody

这种“丑陋”的字符串操作解决方法有效,但仅当 SP 没有“WITH EXECUTE AS CALLER”选项或参数名称中没有“AS”时。在这些情况下,我会得到有关 SP 的额外的、不需要的信息(同样,只需要 SP 主体 - 只需要 AS 和批处理终止符之间的内容)。

还尝试在 SP 主体中使用第一个 BEGIN 和最后一个 END (并获取其间的内容),但由于这些在 SQL Server 中不是强制性的,并且某些 SP 没有它们,所以我不能依赖它们。

关于如何以更好的方式仅获取 SP 正文(代码和注释)有什么想法和/或建议吗?

sql-server stored-procedures
3个回答
1
投票
作为一种快速而肮脏的一次性方式,您可以将

AS

 作为单个单词查找,同时考虑到单个 
EXECUTE AS
 例外。

当然,对于任何包含 -AS- 的注释,这都会失败。

SELECT SUBSTRING( @spText, PATINDEX('%[ ' + CHAR(13) + CHAR(10) + CHAR(9) + ']AS[ ' + CHAR(13) + CHAR(10) + CHAR(9) + ']%', REPLACE(@spText, 'WITH EXECUTE AS CALLER', 'WITH EXECUTE ?? CALLER')) + 3, LEN(@spText))
    

1
投票
您需要解析 T-SQL 存储过程以获取主体。查看

RegEx 从 .sql 文件 C# 中的 DDL 解析存储过程和对象名称。有多个 CLR 程序集可让您在 SQL 中访问正则表达式,或者在您的应用程序语言中执行正则表达式(如果您的应用程序不是纯粹的 SQL)。


0
投票

可用于获取当前数据库内所有存储过程Body。

SELECT definition FROM sys.sql_modules
    
© www.soinside.com 2019 - 2024. All rights reserved.