需要使用“nolock”查找存储过程中使用的表列表吗?

时间:2015-06-17 10:02:23

标签: sql sql-server

我有超过1000个存储过程,由于一些肮脏的程序员,他们会使用'nolock'来存储过程表。

现在,由于日常基础知识中的这个问题,我面临很多问题。

由于某些原因,我无法从SP中删除所有非关键词,但我需要知道它与表名一起出现在哪个存储过程中。

示例:

让我们考虑一个存储过程(sp_user)使用两个表(tbl_salary)和(tbl_account),如果一个表(tbl_account)以(NOLOCK)结尾,那么我需要返回以下细节。

**S.N SP_Name Table_name** 1 sp_user tbl_account

我不需要存储过程名称,我知道可以使用routine_definition like子句获取它,我只需要表名。

任何帮助都会让我非常感激......

3 个答案:

答案 0 :(得分:0)

尝试此查询

SELECT name
FROM   sys.procedures
WHERE  Object_definition(object_id) LIKE '%NOLOCK%'

答案 1 :(得分:0)

试试这个: -

Declare  @stObjToFind       Varchar(150)

Select   @stObjToFind = 'With (Nolock)'

Select   so.id
        ,so.name
        ,so.xtype
From    sysobjects As so With (Nolock)
        Join
        (
            Select  Distinct sc.id
            From    syscomments As sc With (Nolock)
            Where   sc.text Like '%' + @stObjToFind + '%'
        ) As sc0 On so.id = sc0.id
Where   so.name <> @stObjToFind

答案 2 :(得分:0)

For Procedure and dependent TableName您可以使用此查询

SELECT ProcedureName,TableName FROM (
SELECT 
S1.name AS ProcedureName, S2.name AS TableName,
ROW_NUMBER() OVER(partition by S1.name,S2.name ORDER BY S1.name,S2.name) AS R 
FROM sysdepends SD
INNER JOIN sysobjects S1 ON S1.id=SD.id
INNER JOIN sysobjects S2 ON S2.id=SD.depid
WHERE S1.xtype = 'P' ) X 
where R = 1