代码之家  ›  专栏  ›  技术社区  ›  Chris Van Opstal

为什么SQL Server 2000处理select t est.*并选择t.est.*相同?

  •  22
  • Chris Van Opstal  · 技术社区  · 16 年前

    我用手指在SQL Server 2000中输入了一个查询,并在表名中间添加了一个句点:

    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可以毫无问题地运行查询吗?

    更新 :无论使用何种界面(如Enterprise Manager、SSMS、OSQL),查询都会正常工作,并且 Jhonny 下面指出,它甚至在你尝试的时候也很奇怪:

    SELECT TOP 1000 dbota.ble.* FROM dbo.table
    
    6 回复  |  直到 16 年前
        1
  •  4
  •   Mark Canlas    16 年前

    也许表名是由前缀和基名称的简单连接构成的。

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

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

    { owner = t, table = est } != { table = test }
    
        2
  •  4
  •   Philip Kelley    16 年前

    SQL Server 2005及更高版本具有模式的“正确”实现。SQL 2000和更早的版本没有。细节让我难以理解(我使用SQL 2000已经有好几年了),我清楚地记得,创建任何不属于“dbo”的东西都是疯了。这一切都与用户和对象所有权有关,但2000年及更早的模型是相当不合理的。希望有人能在BOL上阅读,做一些实验,并在这里发布他们的结果。

        3
  •  3
  •   Chris Van Opstal    16 年前

    S-SQL reference manual :

    “[dot]可用于将多个名称组合成a.b形式的名称,以引用表中的列或架构中的表。请注意,您只需使用一个带有圆点的符号即可。”

    所以我认为,如果您将tblt est引用为tblt.est,那么只要tblt est中没有名为“est”的列,它就可以正常工作。

    如果找不到与点一起引用的列名,我想它会检查对象的父级。

        4
  •  2
  •   potatopeelings    16 年前

    我发现它是一个bug

    注:比较结果 SQL Server 2000中的算法错误,dot 符号本身对 匹配,因此“dbo.t”将成功 与表“d b o t”、“d.b.o.t”匹配, 等

    从 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. 已修复与点相关的比较错误。
        5
  •  1
  •   gbn    16 年前

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

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

        6
  •  1
  •   Pavel Radzivilovsky    16 年前

    这是一个错误。

    这与SQL Server 2000中列名称的内部表示有关, leaked out .

    您也将无法创建名称与表+列与另一列的连接冲突的TableColumn,例如,如果您有表user和userdetail,那么您将无法分别在这些表中包含列detailage和age。