Sql server 在存储过程中替换动态SQL会导致问题

Sql server 在存储过程中替换动态SQL会导致问题,sql-server,stored-procedures,Sql Server,Stored Procedures,我有以下SQL Server存储过程: CREATE PROCEDURE MB34Procedure (@PT AS NVARCHAR(255) = NULL, @LN AS NVARCHAR(255) = NULL, @FirstName AS NVARCHAR(255) = NULL, @LastName AS NVARCHAR(255) = NULL, @City AS NVARCHAR(255) = NULL, @County

我有以下SQL Server存储过程:

CREATE PROCEDURE MB34Procedure 
    (@PT AS NVARCHAR(255) = NULL,
     @LN AS NVARCHAR(255) = NULL,
     @FirstName AS NVARCHAR(255) = NULL,
     @LastName AS NVARCHAR(255) = NULL,
     @City AS NVARCHAR(255) = NULL,
     @County AS NVARCHAR(255) = NULL)
AS
BEGIN
    SET ANSI_NULLS OFF;
    SET NOCOUNT ON;

    SELECT TOP 10
        p.Spec as PT,
        Tax.LN,
        p.First_Name, p.Last_Name,
        loc.City,
        cou.Name  
    FROM
        D_Provider p
    INNER JOIN 
        D_Location Loc on Loc.D_Provider_ID = p.Id
    INNER JOIN 
        D_Tax Tax on Tax.D_Provider_Id = Loc.D_Provider_ID
    INNER JOIN 
        L_County Cou on cou.Code = loc.County_Id 
    WHERE   
        p.Spec like '%' + @PT + '%' OR @PT IS NULL
        AND Tax.LN LIKE '%' + @LN + '%'  OR @LN IS NULL
        AND p.FirstName LIKE '%' + @FirstName + '%' OR @FirstNameIS NULL
        AND p.LastName LIKE '%' + @LastName + '%' OR @LastName IS NULL
        AND loc.City LIKE '%' + @City + '%' OR @City IS NULL
        AND cou.Name LIKE '%' + @County + '%' OR @County IS NULL
    ORDER BY 
        p.Spec
    OPTION (RECOMPILE);

    SET NOCOUNT OFF;
END;
这应该忽略空参数,对吗

但如果我像这样执行:

EXEC MB34Procedure 'Dentist', null, null, null, null, null, 'Washington'
它返回其他县的记录(最后一个参数)。它应该只返回华盛顿县的牙医


不知道怎么了。该过程最初使用动态SQL,我认为这是错误的。

缺少括号<代码>和的优先级高于
。零件所在位置正确:

WHERE   
    (p.Spec like '%' + @PT + '%' OR @PT IS NULL)
    and (Tax.LN like '%' + @LN + '%'  OR @LN IS NULL)
    and  (p.FirstName like '%' + @FirstName + '%' OR @FirstNameIS NULL)
    and  (p.LastName like '%' + @LastName + '%' OR @LastName IS NULL)
    and  (loc.City like '%' + @City + '%' OR @City IS NULL)
    and  (cou.Name like '%' + @County + '%' OR @County IS NULL)

您缺少括号<代码>和的优先级高于
。零件所在位置正确:

WHERE   
    (p.Spec like '%' + @PT + '%' OR @PT IS NULL)
    and (Tax.LN like '%' + @LN + '%'  OR @LN IS NULL)
    and  (p.FirstName like '%' + @FirstName + '%' OR @FirstNameIS NULL)
    and  (p.LastName like '%' + @LastName + '%' OR @LastName IS NULL)
    and  (loc.City like '%' + @City + '%' OR @City IS NULL)
    and  (cou.Name like '%' + @County + '%' OR @County IS NULL)

设置ansi_空值是个糟糕的主意。它在这里也没有任何用处。此设置不影响串联运算符-仅比较(=,)运算符可以理解。我没有写原件。这是一个可怕的想法设置ansi_空。它在这里也没有任何用处。此设置不影响串联运算符-仅比较(=,)运算符可以理解。我没有写原件。