Нет поддержки OVER в MS SQL Server 2005? - PullRequest
1 голос
/ 26 апреля 2011

OVERI появляется ошибка при попытке выполнить запрос в MS SQL Server Management Studio.Мы используем MS SQL Server 2005 на сервере Windows 2003.

Вот запрос:

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

Решение этой проблемы поможет мне решить мою другую проблему здесь

Ответы [ 4 ]

3 голосов
/ 26 апреля 2011

Проблема в том, что вы используете графический интерфейс Query Designer.Перестань.Дизайнер запросов - это мусор.Это бесполезно для любой нетривиальной разработки запросов.Введите свои запросы в окне редактора Management Studio.

3 голосов
/ 26 апреля 2011

Вы пытались добавить точку с запятой перед вашим With заявлением? (например, ;With q As)


Некоторые общие замечания:

  1. Вы должны выполнить это в запросе, а не в дизайнере. Похоже, вы это исправили.
  2. Перечислять столбцы вместо использования *. То есть в приведенном ниже примере замените Col1, Col2 фактическими столбцами, для которых вы хотите добавить префикс таблицы, откуда они пришли.
  3. Поместите use DatabaseName в начало вашего скрипта, за которым следует разрыв строки, затем GO и еще один разрыв строки.
  4. Если единственным оператором перед оператором With является GO между вашим оператором use и запросом, то точка с запятой не требуется, поскольку это первый оператор в пакете.

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 голос
/ 26 апреля 2011

Проверка уровня совместимости для конкретной базы данных

Есть еще немного подробностей @ http://msdn.microsoft.com/en-us/library/ms178653(v=SQL.90).aspx

Если уровень совместимости меньше 90, новые функции, такие как предложение OVER, доступные только в SQL 2005, отключаются.

1 голос
/ 26 апреля 2011

В документации для SQL Server 2005 говорится, что OVER определенно поддерживается.

Проблема в том, что окно редактора не поддерживает его. Посмотрите, можете ли вы закрыть все панели, кроме SQL и представления результатов, чтобы устранить ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...