SQL Server 存储过程区分大小写吗?

5

我的服务器是大小写敏感的(SQL_Latin1_General_CP1_CS_AS),但数据库是不区分大小写的(SQL_Latin1_General_CP1_CI_AS)。

如果我尝试在这个数据库上创建以下存储过程,我会得到错误信息“必须声明标量变量“@test”。”

CREATE PROCEDURE [dbo].[sp_Test] (@TEST int) as
begin   
    SELECT @test
end
GO

但是,正如我所说,数据库本身不区分大小写。我假设存储过程遵循服务器的区分大小写规则,但我无法找到任何参考资料。有人能告诉我在哪里可以找到相关文档吗?(是的,我尝试了谷歌,但我没有找到任何东西)

1个回答

6
你是正确的。数据库排序规则不控制变量名称的大小写敏感性 - 服务器排序规则控制。
任何其他对象名称(例如表、视图、列)都遵循数据库排序规则。在你的情况下,这意味着不区分大小写,因为你的数据库是 CI(不区分大小写)。
来自 SQL Server Books Online 的信息:

COLLATE (Transact-SQL)

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

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

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

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

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

您可以使用以下命令检查您的服务器排序方式:
SELECT SERVERPROPERTY('collation');

SQL_Latin1_General_CP1_CI_AS
(1 row(s) affected)

另请参阅


1
感谢确认。 - Kyle

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