2011-04-25 160 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