是否有更简洁和可读的方法在存储过程中编写T-SQL查询,该过程将授予过程返回表中所有记录或仅一条记录的能力?
以下是我熟悉哪种方法的方法。在此示例中,存储过程将基于一个或多个过滤器从表中返回所有状态,或仅返回单个状态。不通过过滤器,它返回所有状态。应用StateID或StateAbbreviation过滤器,它将返回一条记录。
ALTER PROCEDURE [dbo].[StateGet]
@StateID int = null,
@StateAbbreviation varchar(3) = null
AS
BEGIN
SELECT *
FROM [dbo].[State]
WHERE
CASE WHEN @StateID = StateID THEN 1
WHEN @StateID IS NULL THEN 1
ELSE 0 END = 1
AND
CASE WHEN @StateAbbreviation = Abbreviation THEN 1
WHEN @StateAbbreviation IS NULL THEN 1
ELSE 0 END = 1
/*
-- Return all states
exec dbo.StateGet
-- Return 1 state (Minnesota)
exec dbo.StateGet 24
exec dbo.StateGet NULL, 'MN'
*/
END
我想使用比上面显示的更可读的语法。谢谢你的帮助。
答案 0 :(得分:1)
试试这段代码:
SELECT *
FROM [dbo].[State]
WHERE (@StateID is null or @StateID = StateID)
AND
(@StateAbbreviation is null or @StateAbbreviation = Abbreviation)
如果将@StateAbbreviation
或@StateAbbreviation
作为null传递给存储过程,则会因条件之间的or
操作数而忽略它。
@StateID = null
(@ StateID为null或@StateID = StateID)=> (true或其他)=>真