Неверный синтаксис рядом с ключевым словом «с». - PullRequest
17 голосов
/ 12 августа 2011

Здравствуйте, я пытаюсь выяснить, почему переключение режима совместимости с 80 на 100 в MSSQL нарушило мою функцию ниже?

    Microsoft SQL Server 2008 R2 (RTM) - 10.50.1617.0 (X64)   Apr 22 2011 19:23:43
Copyright (c) Microsoft Corporation  Express Edition with Advanced Services (64-bit) on
Windows NT 6.1 <X64> (Build 7601: Service Pack 1)

Вот моя функция:

GO
ALTER FUNCTION [dbo].[GetRoot] 
(
    @Param1 int 
)
RETURNS varchar(50)
AS
BEGIN
DECLARE @ReturnValue varchar(50)
with results as
    (
        select parentouid,net_ouid from net_ou where net_ouid=@Param1
        union all
        select t2.parentouid,t2.net_ouid from net_ou t2 
        inner join results t1 on t1.parentouid = t2.net_ouid where t2.parentouid <> t1.net_ouid
    )   
    select @ReturnValue = net_ou.displayname 
    from  NET_OU RIGHT OUTER JOIN
    results ON net_ou.net_ouid = results.ParentouID where results.parentouid=results.net_ouid

    RETURN @ReturnValue

END

Ответы [ 3 ]

36 голосов
/ 12 августа 2011

Попробуйте бросить точку с запятой перед:

;with results as
    (
        select parentouid,net_ouid from net_ou where net_ouid=@Param1
        union all
        select t2.parentouid,t2.net_ouid from net_ou t2 
        inner join results t1 on t1.parentouid = t2.net_ouid where t2.parentouid <> t1.net_ouid
    )   

Дайте этой статье прочитайте, чтобы понять, зачем вам это нужно.Snipit:

Однако, если CTE не является первым оператором в пакете, перед ключевым словом WITH необходимо ставить точку с запятой.В качестве наилучшей практики я предпочитаю ставить все мои CTE перед точкой с запятой - мне кажется, что такой последовательный подход проще, чем необходимость помнить, нужна ли мне точка с запятой или нет.сделайте это для каждого CTE, но если это облегчит вам задачу, это ничего не повредит.

5 голосов
/ 12 августа 2011

Добавьте точку с запятой перед WITH:

;with results as
    (
        select parentouid,net_ouid from net_ou where net_ouid=@Param1
        union all
        select t2.parentouid,t2.net_ouid from net_ou t2 
        inner join results t1 on t1.parentouid = t2.net_ouid where t2.parentouid <> t1.net_ouid
    )   
    select @ReturnValue = net_ou.displayname 
    from  NET_OU RIGHT OUTER JOIN
    results ON net_ou.net_ouid = results.ParentouID where results.parentouid=results.net_ouid

    RETURN @ReturnValue

END

Декларации CTE должны быть первой командой в пакете.

0 голосов
/ 29 августа 2012

Я бы посоветовал вам принять практику окончания всех утверждений точкой с запятой.Это является частью стандарта ANSI и поможет вам при необходимости работать с другой базой данных.SQL Server движется к этому в любом случае.Для многих других команд теперь требуется точка с запятой в SQL Server 2012.

Например,

ALTER FUNCTION [dbo].[GetRoot] 
    (@Param1 int)
RETURNS varchar(50)
AS
BEGIN
    DECLARE @ReturnValue VARCHAR(50)
    ;
    WITH cteResults 
    AS (SELECT parentouid
              ,net_ouid 
          FROM net_ou 
         WHERE net_ouid=@Param1
         UNION ALL
        SELECT t2.parentouid,t2.net_ouid 
          FROM net_ou t2 
         INNER JOIN results t1 
                 ON t1.parentouid = t2.net_ouid
         WHERE t2.parentouid <> t1.net_ouid )   
    SELECT @ReturnValue = net_ou.displayname 
      FROM net_ou 
     RIGHT JOIN cteResults 
             ON net_ou.net_ouid = results.ParentouID
     WHERE results.parentouid=results.net_ouid
    ;   
    RETURN @ReturnValue
    ;   
END
;
GO

В качестве дополнительного бонуса это облегчает чтение запросов на загрузку дерьма.; -)

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