Incorrect syntax near the keyword 'with'.

后端 未结 3 1934
清酒与你
清酒与你 2021-01-17 11:04

Hello I\'m trying to figure out why switching my compatability mode from 80 to 100 in MSSQL broke my function below?

    Microsoft SQL Server 2008 R2 (RTM)         


        
相关标签:
3条回答
  • 2021-01-17 11:10

    I would suggest that you adopt the practice of ending all statements with a semicolon. This is part of the ANSI standard and will help you when need to work on another database. SQL Server are moving towards this in any case. Many more commands require semicolons now in SQL Server 2012.

    E.g.

    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
    

    As an added bonus it makes you queries a crap load easier to read. ;-)

    0 讨论(0)
  • 2021-01-17 11:25

    Add a semicolon before 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 declarations need to be the first command in the batch.

    0 讨论(0)
  • 2021-01-17 11:35

    Try throwing a semi colon in front of the 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
        )   
    

    Give this article a read to understand why you need to do that. Snipit:

    However, if the CTE is not the first statement in the batch, you must precede the WITH keyword with a semicolon. As a best practice, I prefer to prefix all of my CTEs with a semicolon—I find this consistent approach easier than having to remember whether I need a semicolon or not.

    Personally, I don't do it for every CTE, but if that makes things easier for you it won't hurt anything.

    0 讨论(0)
提交回复
热议问题