2010-06-04 23 views
22

我奶油手指在SQL Server 2000中的查询,并在表名中间加了一段:为什么SQL Server 2000将SELECT test。*和SELECT t.est。*设置为相同?

SELECT t.est.* FROM test 

相反的:

SELECT test.* FROM test 

和查询仍然完美执行。即使SELECT t.e.st.* FROM test执行没有问题。

我试过SQL Server 2008中查询失败的错误(错误:列前缀与查询中使用的表名或别名不匹配)。出于纯粹好奇心的原因,我一直在试图弄清楚SQL Server 2000如何处理表名,以便允许黄油指针查询运行,但迄今为止我还没有多少运气。

任何sql大师都知道为什么SQL Server 2000运行查询没有问题?

更新:查询似乎不管用(如企业管理,SSMS,OSQL)和Jhonny指出它下面的怪异甚至还可以当你尝试的界面的工作:

SELECT TOP 1000 dbota.ble.* FROM dbo.table 
+0

如果我不得不冒险猜测是因为SQL将您的查询作为建议。为确保以最有效的方式返回结果,它会查看您的查询并对其进行更改,使其更好地工作。在你的例子中,别名是不重要的,因为它是一个* FROM表...虽然我没有办法证明这一点(因此评论和不回答) 你可以尝试做一个联接,所以你有2个表,并测试它吗?如果有可能模糊,它可能会开始关注更多。 – Shaded 2010-06-04 14:16:45

+0

你现在也让我好奇!我没有一个实例SQL Server 2000交给我,但我很感兴趣...... – AdaTheDev 2010-06-04 14:17:31

+0

@Shaded,我想你可能已经遇到了这个解决方案,但它似乎能够工作,即使在查询中存在多个表时。这个查询也没有问题:'SELECT t.est。*,t.est2。* FROM test,test2'。我也尝试了内部加入一些表格以确保运行良好。 – 2010-06-04 14:22:50

回答

4

也许表名由前缀和基名称的天真拼接构成。

't' + 'est' == 'test' 

也许在SQL Server的更高版本中,这种区别变得更加语义化/更严格。

{ owner = t, table = est } != { table = test } 
+0

我怀疑你遇到了答案。如果我们能够找到任何支持MS的文档,我认为我们可以在此基础上解决这个问题。 – 2010-06-08 14:38:40

4

SQL服务器2005年以后,模式的“适当”实现。 SQL 2000和更早版本没有。细节让我难以置信(自从我使用SQL 2000以来已经有好几年了),我清楚地记得的是,如果你不想创建“dbo”所拥有的任何东西,那么你就会很疯狂。这一切都与用户和对象所有权有关,但2000年和早期的模型非常混乱。希望有人会阅读BOL,做一些实验,并在此发布结果。

+1

”......你会是个疯子......“显然只有我个人的意见,因为多年的逝世而蒙上阴影。 – 2010-06-04 14:24:16

+0

+1。毫无疑问,这是许多其他人的意见,包括我自己在内。 – NotMe 2010-06-14 13:33:36

1

它是在SSMS的“Open table”视图中还是通过企业管理器或通过SSMS查询窗口?

There is/was a SQL Server 2005 issue with SSMS所以如何运行查询会影响它的行为方式。

+1

无论我使用哪个接口,它似乎都能正常工作。到目前为止,我已经测试了OSQL,企业管理器和SSMS 2008查询窗口。 – 2010-06-08 14:32:07

3

S-SQL reference manual

"[dot] Can be used to combine multiple names into a name of the form A.B to refer to a column in a table, or a table in a schema. Note that you calso just use a symbol with a dot in it."

所以我觉得,如果你引用TBLTEST作为tblT.est它将只要不是在TBLTEST称为“EST”列工作确定。

如果它找不到用点引用的列名,我想它会检查该对象的父项。

1

这是一个错误。

它与SQL Server 2000中的列名称的内部表示leaked out

您也将无法创建名称与表+列与另一列串联冲突的表列,例如,如果您有表User和UserDetail,则您将无法使用DetailAge和Age中的列这些表,分别。

2

我发现了一个参考,以它是一个错误

Note: as a result of a comparison algorithm bug in SQL Server 2000, dot symbols themselves have no effect on matching, so "dbo.t" will successfully match with tables "dbot", "d.b.o.t", etc

http://blogs.msdn.com/b/ialonso/archive/2007/12/21/msg-1013-the-object-s-and-s-in-the-from-clause-have-the-same-exposed-names-use-correlation-names-to-distinguish-them.aspx

它被固定在SQL Server 2005中相同的链接>在SQL Server中引入的更改2005

  1. Dot-related comparison bug has been fixed.
相关问题