Sql server 以编程方式标识实际使用特定参数的SQL Server存储过程
我有一个SQL Server数据库(2012年,但可能是2008年),其中包含数千个存储过程 我想通过编程知道哪个存储过程正在接收特定的参数Sql server 以编程方式标识实际使用特定参数的SQL Server存储过程,sql-server,sql-server-2008,tsql,Sql Server,Sql Server 2008,Tsql,我有一个SQL Server数据库(2012年,但可能是2008年),其中包含数千个存储过程 我想通过编程知道哪个存储过程正在接收特定的参数companyid,但实际上并没有在查询中使用它 因此,本项目的两个目标是: 确定哪些存储过程不接收参数companyid 识别那些确实需要参数companyid但在其代码中没有真正使用该参数的存储过程 我打算要么写一些TSQL,要么用C#写一个应用程序来完成任务——这两个建议都可以 所以我希望听到你们的声音,什么是实现这一目标的最佳方式 提前谢谢 ====
companyid
,但实际上并没有在查询中使用它
因此,本项目的两个目标是:
companyid
companyid
但在其代码中没有真正使用该参数的存储过程根据这两项建议,解决方案如下:
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或更多表示它在主体中使用
谢谢你们两位 您的第一个目标可能就是通过这个来实现的
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%'
我可以让它听起来很简单 查看
ROUTINE\u定义
select * from INFORMATION_SCHEMA.ROUTINES
这基本上给出了sp,fn,vw的主体。第一个主体不起作用,因为如果我使用WHERE子句,它返回空。如果我真的将params.name放在SELECT上,它会给出与proce.name相同的确切名称