我有一个名为MyProc1
的存储过程。大部分变量的数据类型都与其源表的数据类型匹配,但少数不匹配。在SQL Server中查找数据类型不匹配存储过程
是否有任何有效的方法来找到不匹配的变量?
现在我手动把表的描述和我的变量数据类型进行比较,但这是一个耗时的任务,因为我必须检查500多个存储过程。
我有一个名为MyProc1
的存储过程。大部分变量的数据类型都与其源表的数据类型匹配,但少数不匹配。在SQL Server中查找数据类型不匹配存储过程
是否有任何有效的方法来找到不匹配的变量?
现在我手动把表的描述和我的变量数据类型进行比较,但这是一个耗时的任务,因为我必须检查500多个存储过程。
输入参数是很容易找到,从另一个堆栈交换answer借用查询:
select
'Parameter_name' = name,
'Type' = type_name(user_type_id),
'Proc_Name' = object_name(object_id),
'Length' = max_length,
'Prec' = case when type_name(system_type_id) = 'uniqueidentifier'
then precision
else OdbcPrec(system_type_id, max_length, precision) end,
'Scale' = OdbcScale(system_type_id, scale),
'Param_order' = parameter_id,
'Collation' = convert(sysname,
case when system_type_id in (35, 99, 167, 175, 231, 239)
then ServerProperty('collation') end)
from sys.parameters
但是在过程内声明的参数是无法访问这种方式,找到那些你需要进行搜索参数程序本身:
select OBJECT_NAME(id) as ProcName, SUBSTRING(text, CHARINDEX('Declare @',text), 250) as DeclaredVarables
from SYSCOMMENTS
where CHARINDEX('Declare @',text) > 0
order by OBJECT_NAME(id), CHARINDEX('Declare @',text)
哪个会得到你的程序名称和(希望)程序的相关位。您可能必须根据编码标准拨入子字符串,但应该给出您在程序中声明的参数列表。
谢谢,这很有帮助。因为我们有不同的方案(即不是dbo)的SP,所以在'Proc_name'之前添加'Schema'= OBJECT_SCHEMA_NAME(object_id),可以看到它们的位置。 –
参数和列有唯一的名称,你可以匹配或是一切只是通用的,如id,代码,名称等? –
声明为参数的变量是唯一的,但我想检查存储过程中使用的所有其他变量。 – StackUser
如果数据类型不匹配,并且没有显式强制转换....则会有隐式强制转换。搜索_implicit casts_,你会发现很多信息,例如.. http://sqlblog.com/blogs/jonathan_kehayias/archive/2010/01/08/finding-implicit-column-conversions-in-the-plan- cache.aspx –