我想要遍历多个存储过程并从每个存储过程中提取一个字符串以在另一个存储过程中使用(基本上是4部分的远程服务器字符串)。
所以我可以从SysObjects
(类型为P)获取存储过程列表并将其放入一个表中,然后我可以循环或游标遍历该表变量并调用sp_helptext
。
但是,我如何将sp_helptext
的结果文本存储到变量中,以便我可以对单词'BOCTEST'等进行CharIndex操作?
是否有像sys.procedures这样存储文本的表。
我想要遍历多个存储过程并从每个存储过程中提取一个字符串以在另一个存储过程中使用(基本上是4部分的远程服务器字符串)。
所以我可以从SysObjects
(类型为P)获取存储过程列表并将其放入一个表中,然后我可以循环或游标遍历该表变量并调用sp_helptext
。
但是,我如何将sp_helptext
的结果文本存储到变量中,以便我可以对单词'BOCTEST'等进行CharIndex操作?
是否有像sys.procedures这样存储文本的表。
最便携的方法是使用ANSI/ISO视图INFORMATION_SCHEMA.ROUTINES
,但您只能获得存储过程定义的前4000个字符:
declare @source_code varchar(max)
select @source_code = t.ROUTINE_DEFINITION
from information_schema.routines t
where specific_schema = 'owner-schema' -- e.g., dbo
and specific_name = 'my_stored_procedure_name' -- your stored procedure name here
您也可以使用系统视图sys.sql_modules
:
declare @source_code varchar(max)
select @source_code = definition
from sys.sql_modules
where object_id = object_id('dbo.my_stored_procedure_name')
declare @source_code varchar(max)
set @source_code = object_definition( 'dbo.my_stored_procedure_name' )
sys.sql_modules
或object_definition()
。 - Aaron BertrandINFORMATION_SCHEMA.ROUTINES.ROUTINE_DEFINITION
的文档(http://technet.microsoft.com/en-us/library/ms188757.aspx)说明它“*如果函数或存储过程未加密,则返回函数或存储过程定义文本的前4000个字符。否则,返回 NULL。*”由于底层数据存储为 varchar(max)
,因此除了简单截断之外的任何行为都会令人惊讶。但我不能说我曾经测试过这些东西。 - Nicholas CareyNicholas Carey 的第三个选项需要做一些更改,
object_definition 函数需要 object_id 作为参数,
所以代码应该是
declare @source_code varchar(max)
declare @objectid int
select @objectid=object_id('dbo.my_stored_procedure_name')
select @source_code = object_definition(@objectid )
请点击以下链接查看更多详细信息: https://msdn.microsoft.com/en-IN/library/ms176090.aspx
您可以使用系统存储过程sp_helptext
将存储过程定义获取到表中,然后只需针对该临时表/表变量查询类似以下的内容即可。
DECLARE @TABLE TABLE
(Line_Number INT IDENTITY(1,1), Text_Column NVARCHAR(MAX));
INSERT INTO @TABLE(Text_Column)
EXECUTE sp_helptext Your_Proc_Name
SELECT *
FROM @TABLE
WHERE Text_Column LIKE '%BOCTEST%'
更新
SELECT p.name
,m.[definition]
FROM sys.procedures p
INNER JOIN sys.sql_modules m
ON P.[object_id] = m.[object_id]
WHERE m.[definition] LIKE '%BOCTEST%'
sys.procedures
目录视图和OBJECT_DEFINITION()
函数。您认为这种方法比上一种更好吗? - M.Alisys.sql_modules
,因为它将遵守事务隔离语义(而 OBJECT_*
函数不会),并且也适用于数据库前缀。 - Aaron Bertrand
sys.sql_modules
。 - Aaron Bertrandsyscomments
,但不应该使用它——它已经被弃用,随时可能被移除,并且会将过程分成多个块。 - Aaron Bertrand