我正在编写一个基于aspx页面文本框输入文本搜索数据库的存储过程。
此存储过程效果很好,但我遇到了问题。
有时@DeptName
和@DutyName
参数为空或为空。
所以我想在参数值为空时跳过或忽略where子句。但我对如何处理这种情况感到困惑。
请给我你的建议。
我的存储过程代码:
DECLARE
@CompanyCode varchar(20)
, @DeptName nvarchar(20)
, @DutyName nvarchar(20)
SELECT
@CompanyCode = 'h101'
, @DeptName = 'IT'
, @DutyName = 'Manager'
SELECT
U.ADDisplayName AS UserName
, LOWER(U.UserID) AS EmpID
, ISNULL(CPN.CompanyName, '') AS CompanyCode
, ISNULL(U.DisplayName_Eng, '') AS DisplayName_Eng
, ISNULL(DT.DisplayName, '') AS DeptName
, ISNULL(DTY.DutyName, '') AS DutyName
, ISNULL(U.CellPhone, '') AS CellPhone
, ISNULL(U.ExtensionNumber, '') AS ExtensionNumber
, ISNULL(U.FaxNumber, '') AS FaxNumber
, ISNULL(U.ChargeJob, '') AS ChargeJob
, ISNULL(LOC.LocationName, '') AS LocationName
, ISNULL(U.Workplace, '') AS Workplace
, ISNULL(U.EMail, '') AS EMail
FROM dbo.tb_User U
INNER JOIN dbo.tb_Dept DT
ON U.MainDeptCode = DT.DeptCode
INNER JOIN dbo.tb_Company CPN
ON U.CompanyCode = CPN.CompanyCode
INNER JOIN dbo.tb_Location LOC
ON U.LocationCode = LOC.LocationCode
AND U.CompanyCode = LOC.CompanyCode
AND U.GroupCode = LOC.GroupCode
AND U.DetailCode = loc.DetailCode
INNER JOIN dbo.tb_Duty DTY
ON U.DutyCode = DTY.DutyCode
AND U.CompanyCode = DTY.CompanyCode
AND U.GroupCode = DTY.GroupCode
AND U.DetailCode = DTY.DetailCode
WHERE U.CompanyCode = @companyCode
AND DT.DisplayName like '%' + @DeptName + '%'
AND DTY.DutyName like '%' + @DutyName + '%'
Order by DeptName desc
谢谢。
答案 0 :(得分:1)
一个非常常见的结构是:
WHERE U.CompanyCode = @companyCode
AND (@DeptName is null or DT.DisplayName like '%' + @DeptName + '%')
AND (@DutyName is null or DTY.DutyName like '%' + @DutyName + '%')
...
...
with (recompile)
语句末尾的 with(重新编译)提示告诉SQL Server“在用变量值替换变量之后”检查优化计划。这样做它允许在其参数为空时完全忽略条件,从而导致通常处于最佳执行状态(仅在非常复杂的语句上,您需要执行更多操作才能帮助SQL引擎找到更好的执行计划)。 p>
还值得注意的是,使用with(重新编译)子句强制在每次执行时检查新计划(而不是重用现有计划),所以如果你的句子将被执行几次,那么你将更适合使用替代方法,如参数化动态SQL。虽然这不是最常见的情况。
PS:如果您的参数也可以是空字符串,则使用 isnull 检查两个选项。您仍然需要添加重新编译提示以最佳地执行它。
WHERE U.CompanyCode = @companyCode
AND (isnull(@DeptName, '') = '' or DT.DisplayName like '%' + @DeptName + '%')
AND (isnull(@DutyName, '') = '' or DTY.DutyName like '%' + @DutyName + '%')
...
...
with (recompile)
答案 1 :(得分:0)
为每个子句添加额外的@DeptName is null
和@DeptName =""
:
WHERE U.CompanyCode = @companyCode
AND ((DT.DisplayName like '%' + @DeptName + '%') or (@DeptName is null) or (@DeptName =''))
AND ((DTY.DutyName like '%' + @DutyName + '%') or (@DeptName is null) or (@DeptName = ''))
Order by DeptName desc
答案 2 :(得分:0)
你可以试试这个。
使用ISNULL可以用指定的替换值替换NULL。
在这种情况下,IF @DeptName 为null,然后将其替换为 DT.DisplayName 的值。同样适用于 @DutyName 。
逻辑函数IIF用于检查空值,但这适用于SQL2012版本,否则CASE expression适用于SQL2008或更高版本。
WHERE U.CompanyCode = @companyCode
AND DT.DisplayName like '%' + ISNULL(IIF(@DeptName = '',NULL,@DeptName),DT.DisplayName) + '%'
AND DTY.DutyName like '%' + ISNULL(IIF(@DutyName = '',NULL,@DutyName),DTY.DutyName) + '%'
Order by DeptName desc