使用C#查询时,SQL Server 2005是区分大小写的。

4

我遇到了一个问题,安装一个在几个客户站点上运行良好的产品时出现了问题,我认为这个问题与他们的数据库服务器上的排序设置有关。我的代码如下(因为代码是专有的,所以我改变了表和变量名称):

using (SqlCommand insertCommand = dbConnection.CreateCommand())
{
    insertCommand.CommandText = "INSERT INTO [myTable] ([valueOne] ,[valueTwo] ,[CreationDate]) VALUES (@valueTwo ,@valueTwo ,@creationDate);select IDENT_CURRENT('myTable');";
    insertCommand.Parameters.AddWithValue("@valueOne", "Value One");
    insertCommand.Parameters.AddWithValue("@valueTwo", "Value Two");
    insertCommand.Parameters.AddWithValue("@CreationDate", CreationDate);                    
    dbConnection.Open();
    object result = insertCommand.ExecuteScalar();
    dbConnection.Close();
}

这适用于大多数网站以及我们的开发和QA机器,但在这个网站上,我们收到一个错误消息,说“必须声明标量变量@creationDate”。我看到的主要差异是该网站将排序规则设置为SQL_Latin1_General_CP1_CS_AS,而我们的设置都是SQL_Latin1_General_CP1_CI_AS。我已经为我们的数据库更改了这个设置,但服务器仍然设置为区分大小写的变体。这确实解决了我们在不同表格中遇到的另一个问题(那个问题是表格名,而不是参数名),但由于某种原因,对于这个问题仍然存在。是否有人有任何想法,能够比逐个修复我们代码库中所有不同大小写的问题更快地解决这个问题?
该网站正在使用SQL Server 2005,并且我们的代码是用C#和.NET 3.5编写的。
谢谢 -Hollis

1
你是否有能力在服务器级别和数据库级别上进行更改?或者是由于某些原因,在服务器级别需要区分大小写敏感吗? - Dan P
1
实例(服务器)排序规则不容易更改,而在数据库级别上进行更改也无法解决问题,因为变量(包括参数)始终是相对于实例的(请参见我的答案)。 - Lucero
1
命令文本包括@creationDate(小写),而您尝试以大写形式传递参数。我不记得这是否区分大小写,现在无法检查。 - JotaBe
2个回答

4
服务器的排序规则控制这些,这是设计上的原因。
来自BOL(我强调):
引用: 标识符的排序规则取决于其定义的级别。实例级对象(例如登录名和数据库名称)的标识符被分配为实例的默认排序规则。数据库内部对象的标识符,例如表、视图和列名,被分配为数据库的默认排序规则。当连接上下文与一个数据库关联时,可以创建变量、GOTO标签、临时存储过程和临时表,然后在上下文切换到另一个数据库时引用它们。因此,变量、GOTO标签和临时表的标识符在实例的默认排序规则中。

Lucero,非常感谢您的回答。我有点怀疑自己在这方面没有好运,但至少现在我明白了其中的原因,这总是有益的。 - Hollis

2
您的变量的大小写敏感性由服务器级别的排序规则控制,而不是数据库级别。请参见关于同一主题的此问题

1
从他的问题中并不清楚他是否能够修改服务器级别的排序规则。在我看来,他似乎只能在数据库级别上进行修改,否则他就不会这样说。“我已经为我们的数据库更改了这个设置,但服务器仍然设置为区分大小写的变体。这确实解决了我们遇到的另一个表格的问题(那个是表格名称,而不是参数名称),但由于某种原因,对于这个问题仍然存在。” - Dan P
谢谢Blake,我可能无法在这里更改服务器,所以我想我必须在代码中修复它...这并不是最糟糕的事情,而且长期来看可能是最好的解决方案。 - Hollis

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