在处理数据库文档主题时,我遇到了一种情况并陷入困境。预先感谢您的潜在帮助。事实如下:
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 正文(代码和注释)有什么想法和/或建议吗?
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))
RegEx 从 .sql 文件 C# 中的 DDL 解析存储过程和对象名称。有多个 CLR 程序集可让您在 SQL 中访问正则表达式,或者在您的应用程序语言中执行正则表达式(如果您的应用程序不是纯粹的 SQL)。
可用于获取当前数据库内所有存储过程Body。
SELECT definition FROM sys.sql_modules