【问题标题】:Stored procedure parameter data type that allows alphanumeric values允许字母数字值的存储过程参数数据类型
【发布时间】:2011-08-17 03:53:12
【问题描述】:

我有一个用于 SQL 2000 的存储过程,它有一个数据类型为 varchar(17) 的输入参数来处理字母数字的车辆标识符 (VIN)。但是,每当我在执行时输入一个包含数字的参数值时,它都会给我一个错误。它似乎只接受字母字符。我在这里做错了什么?

【问题讨论】:

  • 你是如何调用存储过程的——即从查询分析器/SSMS,或从代码——如果是代码,什么类型?另外 - 你得到什么错误?
  • 使用 SQL 查询分析器(例如:storedProc
  • 错误 = 服务器:消息 170,级别 15,状态 1,第 1 行第 1 行:“gn”附近的语法不正确。我输入了“1gn”,不带双引号(语句是“like”不等于,所以可以输入一部分vin)。
  • 您需要输入它并用单引号分隔。
  • 您应该使用参数化查询,但无论如何,当它到达 SQL Server 时,它显然没有被正确引用。存储过程是否构建动态 SQL 字符串?请出示代码。

标签: stored-procedures parameters sql-server-2000


【解决方案1】:

这并没有多大帮助,但在某个地方,您的代码中存在错误、拼写错误或疏忽。我花了 2 年多的时间将 VIN 用作参数,除了后悔没有将其设为 char(17) 而不是 ov varchar(17) 之外,我们在传递字母数字 VIN 值时从未遇到任何问题。在某个地方,我猜它在应用层,有些东西不喜欢数字——也许是一个只寻找字母字符的过滤器?

【讨论】:

  • 它甚至不执行 SQL 存储过程中的代码。它在处理输入参数时立即失败。
【解决方案2】:

基于 cmets,SQL Server 有一个微妙的“特性”,它允许将字母 a-z 用作存储过程参数而无需分隔符。它一直存在(至少从 6.5 开始)

我不确定完整的规则,但它在MSDN (rename SQL Server etc) 中得到了证明:“local”参数周围没有分隔符。我刚刚发现了这个KB article on it

在这种情况下,它可能以中断的数字开头。我认为它适用于包含的数字(但正如我所说,我不确定完整的规则)。

编辑:Martin 确认为“与前导数字中断”,“包含数字”则OK

【讨论】:

  • exec ('create proc #P @x varchar(50) as select @x ') exec #P bar 有效。 exec #P bar1 有效。 exec #P 1bar 失败。这显然是参数值没有被引用的问题。
  • 你大男人(gbn)!就是这样!一旦我单引号将该输入参数分隔为“1gn”,它就可以工作。具有讽刺意味的是,如果您没有在 VIN 的输入参数之前使用数字(例如:gn6),那么它可以在没有分隔符的情况下正常工作 - 看图!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-05
  • 1970-01-01
  • 2017-09-20
  • 2014-04-11
  • 2011-11-24
相关资源
最近更新 更多