Sql server 在存储过程中替换动态SQL会导致问题
我有以下SQL Server存储过程: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
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_空。它在这里也没有任何用处。此设置不影响串联运算符-仅比较(=,)运算符可以理解。我没有写原件。