【发布时间】:2012-06-01 11:43:15
【问题描述】:
使用 SQL Server Management Studio,我得到了一些不想要的结果(对我来说看起来像是一个错误..?)
如果我使用(字段而不是 other_table 的字段):
SELECT * FROM main_table WHERE field IN (SELECT FIELD FROM other_table)
我从 main_table 获得所有结果。
使用正确的大小写:
SELECT * FROM main_table WHERE field IN (SELECT field FROM other_table)
我得到了其他字段出现的预期结果。
自行运行子查询:
SELECT FIELD FROM other_table
我收到一个无效的列名错误。
当然我应该在第一种情况下得到这个错误?
这与排序规则有关吗? 数据库是二进制排序规则。 但是,服务器不区分大小写。 在我看来,服务器组件说“这段代码没问题”并且不允许数据库说该字段是错误的名称..?
我的解决方案有哪些选择?
【问题讨论】:
-
不,这是区分大小写排序规则的正确行为。
main_table必须有一个名为FIELD的列,因此它使用它,因为它是该范围内该大小写的唯一列名。如果您的数据库具有二进制排序规则,您需要使用正确的大小写来引用表/列名称。最好使用表前缀,这样可以捕捉到这种错误。SELECT * FROM main_table WHERE field IN (SELECT o.field FROM other_table o) -
这是一个示例,说明为什么总是指定哪个表以及哪个字段很有价值。看看如果将所有出现的
field或FIELD更改为other_table.field或main_table.field等会发生什么。 -
谢谢大家。我现在已经给表格起了别名并且没有问题。我什至没有想到它正在查看 main_table 中的 FIELD。
标签: sql-server collation