【问题标题】:Find Datatype Mismatch in SQL Server Stored procedures在 SQL Server 存储过程中查找数据类型不匹配
【发布时间】:2015-07-13 13:04:13
【问题描述】:

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

有没有什么有效的方法可以找到不匹配的变量?

现在我手动获取表的描述并将其与我的变量数据类型进行比较,但这是一项耗时的任务,因为我必须检查大约 500 多个存储过程。

【问题讨论】:

  • 参数和列是否具有您可以匹配的唯一名称,或者所有内容都是通用的,例如 id、代码、名称等?
  • 声明为参数的变量是唯一的,但我想检查存储过程中使用的所有其他变量。
  • 如果数据类型不匹配并且没有显式强制转换......将会有隐式强制转换。搜索implicit casts,你会发现很多信息,比如..sqlblog.com/blogs/jonathan_kehayias/archive/2010/01/08/…

标签: sql sql-server stored-procedures sql-server-2012


【解决方案1】:

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

这将为您提供过程名称和(希望)过程的相关位。您可能必须根据编码标准拨入子字符串,但这应该会给您一个在过程中声明的参数列表。

【讨论】:

  • 谢谢,这很有帮助。由于我们在不同的方案中有 SP(即不是 dbo),因此在 Proc_name 之前添加 'Schema' = OBJECT_SCHEMA_NAME(object_id), 有助于查看它们的位置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-19
  • 1970-01-01
相关资源
最近更新 更多