Sql server SQL Server';无效列';对临时表的SELECT查询-区分大小写问题

Sql server SQL Server';无效列';对临时表的SELECT查询-区分大小写问题,sql-server,tsql,sql-server-2008,Sql Server,Tsql,Sql Server 2008,我有一个案例,我对SQL Server配置没有任何控制权 以下是我的配置: SQL Server 2008 SQL Server实例排序规则:Latin_General_BIN(我知道它区分大小写) 给定的数据库(不区分大小写…SQL\u Latin1\u General\u CP1\u CI\u AS) 以下是我想要的场景。。。如有可能: 给定的 何时 然后 列名“field1”无效 有没有办法让这一切顺利进行 我知道这是没有人会想要的,但是因为我在客户端被这种配置所困扰,而且我们有很多在

我有一个案例,我对SQL Server配置没有任何控制权

以下是我的配置:

  • SQL Server 2008
  • SQL Server实例排序规则:Latin_General_BIN(我知道它区分大小写)
  • 给定的数据库(不区分大小写…SQL\u Latin1\u General\u CP1\u CI\u AS)
以下是我想要的场景。。。如有可能:

给定的

何时

然后

列名“field1”无效

有没有办法让这一切顺利进行

我知道这是没有人会想要的,但是因为我在客户端被这种配置所困扰,而且我们有很多在查询中有不同大小写的遗留代码。。。我想知道是否有工作可做

有没有办法让这一切顺利进行

没有临时工作台,没有。 Tempdb继承实例默认排序规则。您已使用不区分大小写的排序规则定义了列,该排序规则应允许您以不区分大小写的方式请求值比较,但列名本身属于数据库排序规则,因此需要按定义引用它

CREATE TABLE #test (Field1 nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS);

INSERT INTO #test 
VALUES ('test'),('TEST'),('Test')

SELECT field1 FROM #test --should fail
SELECT Field1 FROM #test WHERE Field1 = 'tEst' --should work

另一个原因是存储过程而不是代码中的查询。这将破坏区分大小写的排序规则中的唯一名称。在区分大小写的排序规则中,可以将field1、field1和field1放在同一个表中。它们甚至可以是相同或不同的数据类型。换句话说,您尝试执行的操作是不可能的。对于安装了区分大小写排序规则的SQL Server,您唯一的选择是确保对临时表的所有引用都正确区分大小写。如果您没有选择使用不同的不区分大小写排序规则重新安装SQL Server实例,或者安装新的不区分大小写实例,那么您就没有选择,只能确保所有SQL引用表和列的大小写都正确。很抱歉这是一个好习惯。不,如果有机会,那么将数据库移动到与数据库具有相同排序规则的服务器实例。不同的排序总是让人头疼。。。
SELECT field1 FROM #test; /*Notice the lower case on field1*/
CREATE TABLE #test (Field1 nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS);

INSERT INTO #test 
VALUES ('test'),('TEST'),('Test')

SELECT field1 FROM #test --should fail
SELECT Field1 FROM #test WHERE Field1 = 'tEst' --should work