2011-04-25 98 views
1

OVERI在嘗試在MS SQL Server Management Studio中運行查詢時出現錯誤。我們在Windows 2003服務器上使用MS SQL Server 2005。在MS SQL Server 2005中不支持OVER?

下面是該查詢:

WITH q AS 
     (
     SELECT *, 
       ROW_NUMBER() OVER (PARTITION BY dbo.[1_MAIN - Contacts].Contact_ID ORDER BY dbo.[1_MAIN - Contacts].Contact_ID) AS rn 
     FROM dbo.[1_MAIN - Contacts] 
     INNER JOIN 
       dbo.Referral 
     ON  dbo.[1_MAIN - Contacts].Contact_ID = dbo.Referral.Referral_ID 
     INNER JOIN 
       dbo.prov_training_records 
     ON  dbo.[1_MAIN - Contacts].Contact_ID = dbo.prov_training_records.Contact_ID 
     LEFT OUTER JOIN 
       dbo.Resource_Center 
     ON  dbo.[1_MAIN - Contacts].Contact_ID = dbo.Resource_Center.Contact_ID 
     FULL OUTER JOIN 
       dbo.Providers 
     ON  dbo.[1_MAIN - Contacts].Contact_ID = dbo.Providers.Contact_ID 
     ) 
SELECT * 
FROM q 

具有以下信息當我運行它,我只是得到一個彈出窗口:

窗口標題 - 「查詢定義不同」

描述 - 「分析SQL窗格內容時遇到以下錯誤:」

錯誤 - 「OVER SQL構造或語句不受支持。」

然後在最後它說 - 「查詢不能在圖表和條件窗格中用圖形表示。」

但是,我沒有打開圖或標準窗格。

我需要確保我們有正確的語法。如果語法是正確的,那麼我需要解決爲什麼Management Studio會拋出這個錯誤,或者找到OVER的解決方法,並用一種​​不同的方法解決這個問題。

我知道規格說支持「OVER」,但我得到錯誤。

在新的查詢窗口,如果我運行這個它的工作原理:

USE abtcontacts; 
WITH q AS 
     (
     SELECT dbo.[1_MAIN - Contacts].Contact_ID, dbo.[1_MAIN - Contacts].Date_entered_into_Database, dbo.[1_MAIN - Contacts].Date_of_Initial_Contact, 
         dbo.[1_MAIN - Contacts].[Company_ Name], dbo.[1_MAIN - Contacts].Key_Contact_Title, dbo.[1_MAIN - Contacts].Key_Contact_First_Name, 
         dbo.[1_MAIN - Contacts].Key_Contact_Middle, dbo.[1_MAIN - Contacts].Key_Contact_Last_Name, dbo.[1_MAIN - Contacts].Key_Credential, 
         dbo.[1_MAIN - Contacts].Key_Contact_Occupation, dbo.[1_MAIN - Contacts].Key_Degree_1, dbo.[1_MAIN - Contacts].Key_Degree_2, 
         dbo.[1_MAIN - Contacts].Key_Degree_3, dbo.[1_MAIN - Contacts].Date_of_Highest_Degree, dbo.[1_MAIN - Contacts].Work_Setting, 
         dbo.[1_MAIN - Contacts].Website_Address, dbo.[1_MAIN - Contacts].Email_1_Key_Contact, dbo.[1_MAIN - Contacts].Email_2, 
         dbo.[1_MAIN - Contacts].Email_3, dbo.[1_MAIN - Contacts].Day_Time_Phone_Number, dbo.[1_MAIN - Contacts].Extension, 
         dbo.[1_MAIN - Contacts].Mobile_Phone_Number, dbo.[1_MAIN - Contacts].Bus_Fax_Number, dbo.[1_MAIN - Contacts].Home_Phone_Number, 
         dbo.[1_MAIN - Contacts].Home_Fax_Number, dbo.[1_MAIN - Contacts].Mailing_Street_1, dbo.[1_MAIN - Contacts].Mailing_Street_2, 
         dbo.[1_MAIN - Contacts].Mailing_City, dbo.[1_MAIN - Contacts].Mailing_State, dbo.[1_MAIN - Contacts].[Mailing_Zip/Postal], 
         dbo.[1_MAIN - Contacts].Mailing_Country, dbo.[1_MAIN - Contacts].[Bad_Address?], dbo.[1_MAIN - Contacts].[PROV/REG?], 
         dbo.[1_MAIN - Contacts].status_flag, dbo.[1_MAIN - Contacts].status_flag AS status_flag2, dbo.Providers.Referral_Source, dbo.Referral.Contact_Source, 
         dbo.Resource_Center.cert_start_date, dbo.Resource_Center.cert_exp_date, dbo.prov_training_records.Contact_ID AS Expr2, 
         dbo.prov_training_records.date_reg_email_sent, dbo.Resource_Center.access, dbo.Providers.Contact_ID AS Expr1, 
       ROW_NUMBER() OVER (PARTITION BY dbo.[1_MAIN - Contacts].Contact_ID ORDER BY dbo.[1_MAIN - Contacts].Contact_ID) AS rn 
     FROM dbo.[1_MAIN - Contacts] 
     INNER JOIN 
       dbo.Referral 
     ON  dbo.[1_MAIN - Contacts].Contact_ID = dbo.Referral.Referral_ID 
     INNER JOIN 
       dbo.prov_training_records 
     ON  dbo.[1_MAIN - Contacts].Contact_ID = dbo.prov_training_records.Contact_ID 
     LEFT OUTER JOIN 
       dbo.Resource_Center 
     ON  dbo.[1_MAIN - Contacts].Contact_ID = dbo.Resource_Center.Contact_ID 
     FULL OUTER JOIN 
       dbo.Providers 
     ON  dbo.[1_MAIN - Contacts].Contact_ID = dbo.Providers.Contact_ID 
     ) 
SELECT * 
FROM q 
WHERE rn = 1 

解決這個問題會幫我解決我的另一個問題over here

+1

如果按下CTRL + N並在空白腳本窗口中運行,該怎麼辦?我非常懷疑視覺設計師可以應對這個問題。 – 2011-04-25 22:49:22

+0

如果您點擊「新建查詢」按鈕並在窗口中輸入您的查詢,它是否工作? – Gabe 2011-04-25 22:49:29

+0

'[1_MAIN - 聯繫人]是一個可怕的表名。 – Hogan 2011-04-25 22:52:27

回答

3

您是否嘗試過在您的With語句前添加分號? (例如;With q As


的一般常識:

  1. 您必須在查詢未設計師運行此。這聽起來像你已經修復了。
  2. 枚舉列而不是使用*。也就是說,在下面的例子中,將Col1,Col2替換爲你想要的表格前綴的實際列。
  3. use DatabaseName放在腳本的頂部,然後是換行符,然後是GO,然後是另一個換行符。
  4. 如果With語句之前的唯一語句是use語句與查詢之間的GO,則不需要使用分號,因爲它是批處理中的第一條語句。

use DatabaseName 
GO 
WITH q AS 
     (
     SELECT TableName.Col1, TableName.Col2,... 
      , ROW_NUMBER() OVER (PARTITION BY dbo.[1_MAIN - Contacts].Contact_ID 
                 ORDER BY dbo.[1_MAIN - Contacts].Contact_ID) AS rn 
     FROM dbo.[1_MAIN - Contacts] 
      INNER JOIN dbo.Referral 
       ON dbo.[1_MAIN - Contacts].Contact_ID = dbo.Referral.Referral_ID 
      INNER JOIN dbo.prov_training_records 
       ON dbo.[1_MAIN - Contacts].Contact_ID = dbo.prov_training_records.Contact_ID 
      LEFT OUTER JOIN dbo.Resource_Center 
       ON dbo.[1_MAIN - Contacts].Contact_ID = dbo.Resource_Center.Contact_ID 
      FULL OUTER JOIN dbo.Providers 
       ON dbo.[1_MAIN - Contacts].Contact_ID = dbo.Providers.Contact_ID 
     ) 
SELECT * 
FROM q 

+0

我從來沒有在T-SQL中使用分號。很難想象它會如何幫助。 – Gabe 2011-04-25 22:50:49

+2

@Gabe - 要使用公用表表達式,查詢必須是批處理中的第一條語句,否則前一條語句必須通過分號關閉。 「技術上」,你應該用分號結束每一個語句,但你不需要(但)。 – Thomas 2011-04-25 22:52:40

+0

失敗,出現語法錯誤 – UpHelix 2011-04-25 22:57:50

1

documentation for SQL Server 2005OVER肯定是支持的。

問題是編輯器窗口不支持它。查看是否可以關閉除SQL和結果視圖以外的所有窗格,以使錯誤消失。

+0

是的,我刪除了所有其他窗格,但它仍然發生,除非我在新的查詢窗口中運行它。 – UpHelix 2011-04-25 23:11:39

1

檢查兼容級別的特定數據庫上

有一些更詳細@http://msdn.microsoft.com/en-us/library/ms178653(v=SQL.90).aspx

如果兼容級別小於90,則新的功能,如OVER子句,僅在SQL 2005中可用,已關閉。

+0

這不是OP的問題(我認爲)。他們在您通過點擊「編輯表」進入的腳本編輯器中。我只是試着'選擇ROW_NUMBER()(按數字排序)FROM master..spt_values',它肯定不喜歡那樣。 – 2011-04-25 22:56:59

+0

我剛纔意識到有人質疑在OPs其他問題的評論中的兼容性水平...答案是90,所以絕對不是這樣的情況 – 2011-04-25 23:03:05

+0

是的,我的90. – UpHelix 2011-04-25 23:18:20

3

問題是您正在使用查詢設計器GUI。別那樣做。查詢設計器是垃圾。對於任何不重要的查詢開發都沒有用處。在Management Studio編輯器窗口中鍵入您的查詢。

+0

甜,我很想,我其實不使用GUI功能,我只是用它來運行查詢並創建新的「視圖」。這個SQL是創建一個「視圖」,我以後可以選擇。 – UpHelix 2011-04-25 23:10:30

+1

@戴爾,對。所以不要使用視圖設計器。創建視圖的方法是使用CREATE VIEW語句。如果你這樣做,那麼你不會得到你遇到的錯誤。該錯誤純粹是一個GUI錯誤/功能。 – sqlvogel 2011-04-26 09:04:10