Sql server 如何修复';IF语句';附近的语法错误;?

Sql server 如何修复';IF语句';附近的语法错误;?,sql-server,tsql,if-statement,stored-procedures,Sql Server,Tsql,If Statement,Stored Procedures,当我试图用CTE创建这样的存储过程时: CREATE PROCEDURE bng_normalize_ps @ps_id uniqueidentifier, @u_name VARCHAR(50), @u_type VARCHAR(50) AS BEGIN WITH My_Recursive (link, n_type, n_name, F_Parent ) AS ( SELECT i.link

当我试图用CTE创建这样的存储过程时:

CREATE PROCEDURE bng_normalize_ps 
    @ps_id uniqueidentifier, 
    @u_name VARCHAR(50), 
    @u_type VARCHAR(50) 
    AS
 BEGIN

WITH My_Recursive (link, n_type, n_name, F_Parent )
    AS
    (
        SELECT
            i.link
            , t.C_Name n_type
            , i.C_Name as n_name
            , s.F_Parent
        FROM ED_Network_Items i
        JOIN ES_Network_Items_Types t on i.F_Network_Items_Types = t.LINK
        JOIN ED_Network_Struct s on s.F_Child = i.LINK
        WHERE
            i.link = @ps_id
        UNION ALL
        SELECT
            i.link
            , t.C_Name n_type
            , i.C_Name as n_name
            , s.F_Parent
        FROM ED_Network_Items i
        JOIN ES_Network_Items_Types t on i.F_Network_Items_Types = t.LINK
        JOIN ED_Network_Struct s on s.F_Child = i.LINK
        JOIN My_Recursive r ON s.F_Parent = r.link
    )

    IF EXISTS(SELECT n_name FROM My_Recursive r WHERE n_name LIKE '%' + @u_name + '%' AND n_type = @u_type GROUP BY n_name HAVING COUNT(*) > 1)
    BEGIN
        SELECT CONCAT('DELETE DOUBLES for ', @u_type, ' ', @u_name)
        RETURN
    END

    SELECT link, n_type, n_name, F_Parent
    FROM My_Recursive r
    WHERE
        n_name LIKE '%' + @u_name + '%'
        AND n_type = @u_type
    END
SQL Server返回:

If语句附近的语法错误


我在调查手册,没发现出什么事。此代码有什么问题?

使用
@@rowcount
而不是
exist

CREATE PROCEDURE bng_normalize_ps 
    @ps_id uniqueidentifier, 
    @u_name VARCHAR(50), 
    @u_type VARCHAR(50) 
    AS
 BEGIN

WITH My_Recursive (link, n_type, n_name, F_Parent )
    AS
    (
        SELECT
            i.link
            , t.C_Name n_type
            , i.C_Name as n_name
            , s.F_Parent
        FROM ED_Network_Items i
        JOIN ES_Network_Items_Types t on i.F_Network_Items_Types = t.LINK
        JOIN ED_Network_Struct s on s.F_Child = i.LINK
        WHERE
            i.link = @ps_id
        UNION ALL
        SELECT
            i.link
            , t.C_Name n_type
            , i.C_Name as n_name
            , s.F_Parent
        FROM ED_Network_Items i
        JOIN ES_Network_Items_Types t on i.F_Network_Items_Types = t.LINK
        JOIN ED_Network_Struct s on s.F_Child = i.LINK
        JOIN My_Recursive r ON s.F_Parent = r.link
    )SELECT n_name FROM My_Recursive r WHERE n_name LIKE '%' + @u_name + '%' AND n_type = @u_type GROUP BY n_name HAVING COUNT(*) > 1

    IF @@rowcount > 0
    BEGIN
        SELECT CONCAT('DELETE DOUBLES for ', @u_type, ' ', @u_name)
        RETURN
    END

    SELECT link, n_type, n_name, F_Parent
    FROM My_Recursive r
    WHERE
        n_name LIKE '%' + @u_name + '%'
        AND n_type = @u_type
 END

WITH
是一个表达式,后面必须跟一个
SELECT
或DML语句。CTE后面必须跟一个引用部分或全部CTE列的SELECT、INSERT、UPDATE、MERGE或DELETE语句。CTE也可以在CREATE VIEW语句中指定,作为视图的defining SELECT语句的一部分