0

我有一个带有数千个存储过程的 SQL Server 数据库(它是 2012 年,但可能是 2008 年)。

我想以编程方式知道哪个存储过程正在接收特定参数companyid,但并没有真正在他们的查询中使用它。

所以这个项目的两个目标是:

  1. 确定哪些存储过程不接收参数companyid
  2. 识别那些确实需要该参数companyid但并未在其代码中真正使用该参数的存储过程

我正在设想编写一些 TSQL 或用 C# 编写一个应用程序以完成任务 - 任何一个建议都会奏效。

所以我希望听到你们的消息,实现这一目标的最佳方法是什么?

提前致谢

==================================================== ========
基于这两个建议,解决方案如下:

SELECT  Specific_Name,  
        ((len(ROUTINE_DEFINITION) - len(replace(ROUTINE_DEFINITION, '@companyid', '')))/ 10) as COUNT,  
    ROUTINE_DEFINITION  
FROM    INFORMATION_SCHEMA.ROUTINES  
WHERE   ROUTINE_DEFINITION LIKE '%@companyid%'  
ORDER BY 2, 1

注意:字符串替换除以 10 将为您提供正文中该特定字符串的实例数。1表示它只是参数,2或更多表示它在body中使用。

谢谢你们俩 !!

4

2 回答 2

1

我可以让它听起来很简单。

ROUTINE_DEFINITION领域

select * from INFORMATION_SCHEMA.ROUTINES 

这基本上给了你 sp、fn、vw 的主体。

于 2013-04-24T23:48:45.223 回答
1

你的第一个目标可以通过这个来实现

SELECT proce.name FROM sys.procedures proce 
INNER JOIN sys.procedures params ON proce .object_id=params.object_id
WHERE params.name='@companyid'

对于第二个目标,你可以试试这个

SELECT proce.name from sys.procedures proce 
INNER JOIN sys.sql_modules modules on proce.object_id=modules.object_id
WHERE definition like '%@companyid%'
于 2013-04-24T23:15:27.203 回答