2010-06-25 66 views
5

下面的查詢不返回結果和SQL Server 2008(在SP1測試)上沒有錯誤,你可以運行它反對任何數據庫,甚至主:括號在SQL Server SELECT查詢中的作用?

WITH computed_table (id) AS 
(
    SELECT id FROM this_table_does_not_exist 
) 
(SELECT * FROM computed_table) 
UNION 
(SELECT * FROM another_table_that_does_not_exists) 

在SQL Server 2005中,你會得到一個錯誤,因爲表格不存在。

WITH computed_table (id) AS 
(
    SELECT id FROM this_table_does_not_exist 
) 
SELECT * FROM computed_table 
UNION 
(SELECT * FROM another_table_that_does_not_exists) 

的同樣的問題似乎與真實的表: 你得到,如果你還刪除了一些括號得到一個錯誤,在某些情況下,查詢不返回任何結果,如果你做一些一些細微的變化,像刪除空格或回車,它再次工作...

我認爲可能是在查詢中的問題,因爲在圓括號中的SELECT可能被解釋爲表達式而不是子查詢,作爲在this page。但那至少應該返回一個錯誤。

我錯過了什麼嗎?

編輯26/06/2010:我運行了一些分析會話,結果如下。

對於上面的查詢,事件的序列是:

  • 異常(錯誤:208,無效的對象名稱)
  • SQL:BatchStarting
  • SQL:StmtStarting
  • SQL:BatchCompleted

對於無括號的查詢:

  • 異常(錯誤:208)
  • SQL:BatchStarting
  • SQL:StmtStarting
  • 異常(錯誤:208)
  • 用戶錯誤消息(無效的對象名稱this_table_does_not _exist')
  • SQL :BatchCompleted

對於工作查詢:

  • SQL:BatchStarting
  • SQL:StmtStarting
  • 顯示計劃全部
  • SQL:StmtCompleted事件
  • SQL:BatchCompleted

我也跑與真實的表是造成我同樣的一個查詢問題。的事件的序列是:

  • SQL:BatchStarting
  • SQL:StmtStarting
  • SQL:BatchCompleted

否早 「異常」=>表中存在。 否「SQL:StmtCompleted」=>這意味着發生錯誤,我看不到任何其他原因爲什麼不會引發此事件。 否「Showplan All」=>這意味着錯誤發生在計算執行計劃之前(或何時)。這可能是由cte和括號組合引起的。

我將在下週提出有關Microsoft支持的問題。

+0

您是否嘗試將選擇*改爲實際列名? – DForck42 2010-06-25 19:51:33

+1

多麼美好的問題!首先,在2008年,您也會在第二個陳述中看到錯誤。另外,我沒有看到UNION聲明與刪除聯合的奇怪行爲有關,第二個選擇似乎沒有改變結果。一個有趣的事情 - 在使用第一個陳述時,要求估計執行計劃時,我根本沒有計劃。我現在會運行一個跟蹤。下次再談。 – MaasSql 2010-06-26 03:22:58

+0

您是否還會發布以下所述的代碼:「我還用真實表格運行了其中一個查詢,這導致了同樣的問題。」此外,出於純粹的好奇心,你是否將此視爲發展/生產問題的阻礙者?如果是這樣,似乎解決方法是不遵循cte,然後是括號模式。 – MaasSql 2010-06-26 18:40:41

回答

3

所以,我簡化了一下sql,就像我之前對原始問題的評論一樣。

WITH computed_tabled AS 
(
    SELECT id FROM this_table_does_not_existd 
) 
(SELECT id FROM computed_tabled) 

這似乎給了我們相同的行爲。然後我跑了一絲。事件類:

  • SQL:批量開始
  • SQL:批量完成
  • SQL:StmtStarting
  • SQL:StmtCompleted事件
  • 顯示計劃全部
  • 顯示計劃XML

我抓到意外:

  • SQL:BatchStarting
  • SQL:StmtStarting
  • SQL:BatchCompleted

注:沒有SQL:StmtCompleted事件,沒有計劃。因此,接下來,我回到捕獲設置,並添加錯誤和警告下的每個事件類。重新運行查詢,你知道什麼?首先發現的事件是:

Error: 208, Severity: 16, State: 1 

猜猜208是什麼?但是,客戶從來沒有看到錯誤。

什麼我認爲正在發生的是DBMS中的代碼說 - 嘿,他們並沒有要求我們返回任何東西或做任何事情,所以爲什麼要麻煩?讓我們爲更需要的人騰出一些資源。

所以,我想這段代碼:

--asdfasdf 
(SELECT 1) 

這完全吹我的理論了。括號不被解釋爲表達式。相反,他們被解釋爲一個完整的查詢(也就是說,客戶端要求返回某些內容),並返回1列和1行的記錄集。但沒有計劃 - 可能不需要計劃,因爲沒有涉及的數據庫對象。

所以,用我的心更亂一些我嘗試這樣做:

declare @id as integer; 
; 
WITH computed_table AS 
(
    SELECT id FROM this_table_does_not_exist 
) 
select @id = (SELECT id FROM computed_table) 

其中,就像刪除括號,產生用戶錯誤消息。

我說,你不會錯過任何東西。我認爲這是一個MS SQL Server錯誤。這當然似乎與cte和括號有關。我嘗試了谷歌搜索提到它,但沒有找到任何東西。這將給我在下次當地PASS會議上討論的問題。對不起,我必須補充的情況是混亂。如果我學到了一些東西,我肯定會在這裏發佈!


更新:2010-06-26 10:09 CST 我到微軟Connect在試圖找到這家機構的問題。我無法找到cte 208或cte invalid object附近的東西。老實說,我不知道另一個bug列表網站的sql服務器可以檢查。我也試着搜索微軟支持,再次搜索谷歌。