gpt4 book ai didi

sql-server - 如何在参数为 null 或为空时跳过或忽略 where 子句

转载 作者:行者123 更新时间:2023-12-02 03:03:29 25 4
gpt4 key购买 nike

我正在编写一个关于基于 aspx 页面文本框输入文本搜索数据库的存储过程。

这个存储过程运行良好,但我有一个问题。

有时 @DeptName@DutyName参数为空或 null。

因此,当该参数值为空时,我想跳过或忽略 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

谢谢你。

最佳答案

一个非常常见的结构是:

WHERE   U.CompanyCode   = @companyCode 
AND (@DeptName is null or DT.DisplayName like '%' + @DeptName + '%')
AND (@DutyName is null or DTY.DutyName like '%' + @DutyName + '%')
...
...
with (recompile)

与(重新编译)语句末尾的提示是告诉 SQL Server 在用变量值替换变量后检查优化计划。这样做允许在参数为空时完全忽略条件,通常会导致最佳执行(只有在非常复杂的语句上,您需要做更多的事情才能帮助 SQL 引擎找到更好的执行计划)。

还值得注意的是,使用 with (recompile) 子句会强制在每次执行时检查新计划(而不是重用现有的计划),因此如果您的句子将在第二次执行多次,那么您会更好适合使用替代方案,如参数化动态 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)

关于sql-server - 如何在参数为 null 或为空时跳过或忽略 where 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44325216/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com