MS SQL Server 2005中是否不支持OVER?

时间:2011-04-25 22:40:48

标签: sql-server sql-server-2005 tsql

尝试在MS SQL Server Management Studio中运行查询时出现OVERI错误。我们在Windows 2003服务器上使用MS SQL Server 2005。

以下是查询:

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构造或语句。”

然后在结尾处说 - “查询无法在图表和标准窗格中以图形方式表示。”

但是,我没有打开Diagram或Criteria窗格。

我需要确保我们有正确的语法。如果语法正确,那么我要么修复管理工作室抛出此错误的原因,要么找到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

4 个答案:

答案 0 :(得分:3)

您是否尝试在With声明前添加分号? (例如;With q As


一些一般性说明:

  1. 您必须在查询中运行此操作而不是设计器。听起来你已经解决了这个问题。
  2. 枚举列而不是使用*。即,在下面的示例中,将Col1,Col2替换为您希望以表格为前缀的实际列。来自它们。
  3. use DatabaseName放在脚本的顶部,然后换行,然后是GO,然后是另一个换行符。
  4. 如果With语句之前的唯一语句是GO语句与查询之间的use,则不需要分号,因为它是批处理中的第一个语句。
  5. 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
    

答案 1 :(得分:3)

问题是您正在使用查询设计器GUI。别那样做。查询设计器是垃圾。它对任何非平凡的查询开发都没用。在Management Studio编辑器窗口中键入查询。

答案 2 :(得分:1)

documentation for SQL Server 2005表示肯定支持OVER

问题是编辑器窗口不支持它。看看是否可以关闭除SQL和结果视图之外的所有窗格以使错误消失。

答案 3 :(得分:1)

检查特定数据库的兼容性级别

@ http://msdn.microsoft.com/en-us/library/ms178653(v=SQL.90).aspx

还有一些细节

如果兼容级别小于90,则关闭仅在SQL 2005中可用的新功能(如OVER子句)。