2015-07-13 55 views
2

我有一个名为MyProc1的存储过程。大部分变量的数据类型都与其源表的数据类型匹配,但少数不匹配。在SQL Server中查找数据类型不匹配存储过程

是否有任何有效的方法来找到不匹配的变量?

现在我手动把表的描述和我的变量数据类型进行比较,但这是一个耗时的任务,因为我必须检查500多个存储过程。

+1

参数和列有唯一的名称,你可以匹配或是一切只是通用的,如id,代码,名称等? –

+0

声明为参数的变量是唯一的,但我想检查存储过程中使用的所有其他变量。 – StackUser

+0

如果数据类型不匹配,并且没有显式强制转换....则会有隐式强制转换。搜索_implicit casts_,你会发现很多信息,例如.. http://sqlblog.com/blogs/jonathan_kehayias/archive/2010/01/08/finding-implicit-column-conversions-in-the-plan- cache.aspx –

回答

2

输入参数是很容易找到,从另一个堆栈交换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) 

哪个会得到你的程序名称和(希望)程序的相关位。您可能必须根据编码标准拨入子字符串,但应该给出您在程序中声明的参数列表。

+0

谢谢,这很有帮助。因为我们有不同的方案(即不是dbo)的SP,所以在'Proc_name'之前添加'Schema'= OBJECT_SCHEMA_NAME(object_id),可以看到它们的位置。 –

相关问题