Sql 传递参数时过滤a,不传递参数时返回all

Sql 传递参数时过滤a,不传递参数时返回all,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,当我传递参数时,如何从查询中筛选记录,当参数有空值时,如何返回所有记录 SELECT nfv.Company_id, COUNT(1) as NegativeFeedback,SUM(allocated_score) as ScoreSum FROM dbo.NegativeFeedbackView nfv WHERE ISNULL(nfv.comp_nature_id,0) = @compNatureId GROUP BY nfv.Company_id 下面是一个示例过程,它使用可选参数进

当我传递参数时,如何从查询中筛选记录,当参数有空值时,如何返回所有记录

SELECT nfv.Company_id, COUNT(1) as NegativeFeedback,SUM(allocated_score) as ScoreSum
FROM dbo.NegativeFeedbackView nfv
WHERE ISNULL(nfv.comp_nature_id,0) = @compNatureId 
GROUP BY nfv.Company_id

下面是一个示例过程,它使用可选参数进行筛选

CREATE PROCEDURE USP_MyProc(@FilterParameter AS VARCHAR(100) = NULL)

BEGIN

SELECT nfv.Company_id, COUNT(1) as NegativeFeedback,SUM(allocated_score) as ScoreSum
FROM dbo.NegativeFeedbackView nfv

WHERE
(@compNatureId  IS NULL OR ISNULL(nfv.comp_nature_id,0)= @compNatureId )

GROUP BY nfv.Company_id

END

使用
IF/ELSE

e、 g

尝试将这些情况合并到单个查询中:

SELECT nfv.Company_id, COUNT(1) as NegativeFeedback,SUM(allocated_score) as ScoreSum
FROM dbo.NegativeFeedbackView nfv
WHERE ISNULL(nfv.comp_nature_id,0) = @compNatureId 
OR @compNatureId IS NULL
GROUP BY nfv.Company_id
很可能会产生次优计划,并且它不能使用
comp\u nature\u id
上的任何索引(如果存在)

SELECT nfv.Company_id, COUNT(1) as NegativeFeedback,SUM(allocated_score) as ScoreSum
FROM dbo.NegativeFeedbackView nfv
WHERE ISNULL(nfv.comp_nature_id,0) = @compNatureId 
OR @compNatureId IS NULL
GROUP BY nfv.Company_id