SQL Server中的变量名是否区分大小写?

3
当我执行这种格式的SQL命令时:SP_HELPTEXT Sproc1。结果集将显示无法找到存储过程“SP_HELPTEXT”。但是,如果我将SQL命令替换为小写字母,如sp_helptext Sproc1,它肯定会显示Sproc1的内容。
我在我的程序中使用Sproc1,当程序执行Sproc1时,它会返回一个消息:
Must declare the variable '@Variable1'. 

虽然我已经声明了特定的变量。

我有一个提示,问题与排序规则、大小写敏感或不敏感设置有关。有人知道如何解决吗?


另一种出现大小写敏感变量名的情况:

CREATE PROCEDURE Foo @customerID int AS
PRINT @customerId

那么,变量的情况确实不同吗?我的意思是,它可能只是没有被声明(在作用域内)...创建/发布一个最小的测试用例来展示问题。 - user166390
实例的排序规则是什么?使用下面的 T-SQL 查找排序规则:SELECT DATABASEPROPERTYEX('DatabaseName', 'Collation') SQLCollation; - Hiten004
@Hiten004,我已经提供了排序规则。 - RedHat
将Databasename更改为您的数据库! - Hiten004
@Hiten004,请参考上述更改。 - RedHat
1个回答

4
您的服务器排序规则区分大小写。
您的数据库有一个(如您所示)不区分大小写的排序规则,但是当变量出现大小写问题时,服务器排序规则才是最重要的。
对于在数据库主库中定义为小写的存储过程sp_helptext也是同样的情况。因此,当您调用SP_HELPTEXT时,它会找不到。
要解决在区分大小写的服务器排序规则下使存储过程正常工作的问题,您必须确保对变量@Variable1的每个引用都完全一致。不是@variable1@VARIABLE1
使用此方法检查您的服务器排序规则。
SELECT SERVERPROPERTY('collation');

来自SQL Server Books Online:

COLLATE (Transact-SQL)

标识符的排序规则取决于其定义的级别。

  • 实例级对象(如登录名和数据库名称)的标识符将被分配为实例的默认排序规则。
  • 数据库内的对象的标识符,如表、视图和列名,将被分配为数据库的默认排序规则。

    例如,在区分大小写的排序规则下,可以在一个数据库中创建两个仅在大小写方面不同的表,但不能在不区分大小写的排序规则下创建。有关详细信息,请参阅Database Identifiers

  • 变量GOTO 标签临时存储过程临时表的标识符位于服务器实例的默认排序规则中。

    当连接上下文与一个数据库相关联时,可以创建变量、GOTO 标签、临时存储过程和临时表,然后在上下文已切换到另一个数据库时引用它们。

另请参阅


服务器排序规则为Latin1_General_BIN。我在本地机器上有多个数据库,我认为修改每个触发器和存储过程非常繁琐。当我使用Win XP 32位时,我没有遇到这样的问题,但现在我迁移到了Win 7 64位操作系统,我希望它与问题无关。我想问一下是否有办法修改服务器排序规则,请帮忙。谢谢。 - RedHat
可以更改服务器排序规则,但并不容易。设置或更改服务器排序规则 - Mikael Eriksson
尽管我的问题已被关闭,因为它不属于主题范围,但我仍想分享我是如何解决这个问题的,并且我要感谢Mikael的评论,因为它指出了根本原因。我按照这个链接中的步骤进行操作:http://www.sp-configure.com/change-sql-server-default-collation/ - RedHat
但是这个过程花费了很长时间,所以我被迫停止了正在进行的过程。我决定卸载SQL Server 2000,重新启动机器,然后再次安装,并在安装设置期间选择适当的服务器排序规则。现在系统存储过程(Transact-SQL)无论是以小写还是大写输入和执行都可以正常工作。 - RedHat
@Alex,很高兴听到你解决了这个问题。我的“关闭投票”是为了将问题移动到DBA,在那里你的问题会被更多关于此方面的专业人士看到,也许你会在那里得到不同/更好的建议。 - Mikael Eriksson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接