2010-06-04 27 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.
相關問題