sql - SQL 显示存储过程详细信息,其中存储过程的内容使用临时表中包含的函数名
问题描述
我有一个包含函数名称列表的临时表,我想找到在存储过程代码中提到其中一个函数名称的所有存储过程作为查询结果中的新行。
这是我一直在尝试的:
--Gets list of functions and puts them into a new temp table.
Select *
into #functionList
from
(
SELECT name
FROM sys.sql_modules m
INNER JOIN sys.objects o
ON m.object_id=o.object_id
WHERE type_desc like '%function%'
) as myFunctionList
--The following SQL will get me a list of stored procedures where the contents of the stored procedure
--contains a word I want to look up.
SELECT DB_NAME() as DB_Name
,name AS Procedure_name
,SCHEMA_NAME(schema_id) AS Schema_name
,Type_desc
,Create_date
,Modify_date
FROM sys.procedures
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE "%MyWord%"
最后一步让我很困惑,因为我不想查找“MyWord”,而是想检查我在临时表中的每个结果。我目前正在尝试查看是否可以使用子查询来解决此问题,但我运气不佳。
解决方案
我设法解决了我的问题,我从这里获得了一些灵感。
创建 2 个临时表,一个用于保存函数名称,另一个用于保存最终查询的结果。
CREATE TABLE #FunctionList
(
FunctionID INT IDENTITY(1,1) PRIMARY KEY
,[Name] NVARCHAR(250) NOT NULL
)
CREATE TABLE #Results
(
FunctionID INT IDENTITY(1,1) primary key
,[DB_Name] NVARCHAR(250) NULL
,[Procedure_name] NVARCHAR(250) NULL
,[Schema_name] NVARCHAR(250) NULL
,[Type_desc] NVARCHAR(250) NULL
,[Create_date] DateTime NULL
,[Modify_date] DateTime NULL
)
使用函数名称填充临时表。
INSERT INTO #FunctionList([Name])
SELECT [Name]
FROM
(
SELECT
[Name]
FROM sys.sql_modules m
INNER JOIN sys.objects o ON m.object_id=o.object_id
WHERE type_desc LIKE '%function%'
) AS myFunctionList
遍历函数名称临时表并查看是否在任何存储过程中使用了函数。如果是,则将结果添加到搜索结果临时表中。
DECLARE @Id INT --For the loop.
DECLARE @functionName NVARCHAR(250) --For the dynamic LIKE.
WHILE (SELECT Count(*) FROM #FunctionList) > 0
BEGIN
SELECT TOP 1 @Id = FunctionID FROM #FunctionList
SELECT TOP 1 @functionName = [Name] FROM #FunctionList
INSERT INTO #Results([DB_Name],[Procedure_name],[Schema_name],[Type_desc],[Create_date],[Modify_date])
SELECT
[DB_Name]
,[Procedure_name]
,[Schema_name]
,[Type_desc]
,[Create_date]
,[Modify_date]
FROM
(
SELECT DB_NAME() AS DB_Name
,[Name] AS [Procedure_name]
,SCHEMA_NAME(schema_id) AS [Schema_name]
,[Type_desc] AS [Type_desc]
,[create_date] AS [create_date]
,[Modify_date] AS [Modify_date]
FROM sys.procedures
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%' + @functionName + '%'
) AS abc
Delete #FunctionList Where FunctionID = @Id --Next TOP 1 will be next row in Fn list.
End
瞧!它有效并给了我想要的结果。
就个人而言,我不太喜欢我是如何做到这一点的,我之所以这么认为,是因为脚本的 while 循环的使用不会高效。如果我能对此脚本提出任何建议以提高性能,我将不胜感激。
推荐阅读
- javascript - 避免滚动窗口 iframe
- jquery - Jquery:autoNumeric.js 在提交时删除格式编号
- azure - Azure Functions 访问私有资源 - 从 AWS 迁移
- javascript - 错误:操作必须是普通对象。使用自定义中间件进行异步操作 Redux
- javascript - 如何仅增加桌面设备的字体大小
- javascript - 如何将高度设置为宿主元素而不是 @media 类(对于同一元素)
- python - 重定向到烧瓶中的不同路线
- c# - 从数据表中选择数据
- android - 在 GlSurfaceView.Renderer 实现中旋转视频的矩阵(帧)
- dart - 如何在飞镖中进行从超类到子类的回调