我遇到了安装在几个客户网站上工作的产品的问题,我认为这个问题与他们的数据库服务器上的Collation设置有关。我的代码看起来像这样(我改变了表和变量名称,因为代码是专有的):
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
答案 0 :(得分:4)
服务器的校对控制那些,这是设计的。
来自BOL(强调我的):
标识符的排序规则取决于标识符的级别 定义。实例级对象的标识符,例如登录和 数据库名称被分配了实例的默认排序规则。 数据库中对象的标识符,例如表,视图和 列名称被分配了数据库的默认排序规则。 变量,GOTO标签,临时存储过程和临时存储 可以在与连接上下文关联时创建表 一个数据库,然后在上下文切换到时引用 另一个数据库因此,变量标识符,GOTO 标签和临时表属于默认排序规则 实例强>
答案 1 :(得分:2)
变量的区分大小写由服务器级别排序规则控制,而不是数据库级别。请参阅this question on the same topic。