如何根据值使用或忽略SQL存储过程中的参数
我有几个下拉列表,在前端有项值对。假设在第一个ddl(动物)中,狗的值为1,猫的值为2,任意值为0,在第二个ddl(颜色)中,黑色的值为1,白色的值为2,任意值为0 此外,我还想使用存储过程通过下拉列表中选择的值从db中选择数据 因此,只有在值为的情况下才应过滤结果!=0如果为0,则不应过滤结果。 我所能想到的最佳解决方案是在代码端创建SELECT查询(不带SP): 但这足够好吗?或者有更好的方法来实现这一点,例如在SP端?以某种方式使用默认值?如何根据值使用或忽略SQL存储过程中的参数,sql,asp.net,Sql,Asp.net,我有几个下拉列表,在前端有项值对。假设在第一个ddl(动物)中,狗的值为1,猫的值为2,任意值为0,在第二个ddl(颜色)中,黑色的值为1,白色的值为2,任意值为0 此外,我还想使用存储过程通过下拉列表中选择的值从db中选择数据 因此,只有在值为的情况下才应过滤结果!=0如果为0,则不应过滤结果。 我所能想到的最佳解决方案是在代码端创建SELECT查询(不带SP): 但这足够好吗?或者有更好的方法来实现这一点,例如在SP端?以某种方式使用默认值? 提前谢谢 您的解决方案应该可以工作,但如果您愿意
提前谢谢 您的解决方案应该可以工作,但如果您愿意,也可以将逻辑移到SQL中:
CREATE PROCEDURE dbo.FilterByColorAndAnimal
(
@AnimalId INT = 0,
@ColorId INT = 0
)
AS
BEGIN
DECLARE @SQL = N'
SELECT *
FROM table W
WHERE 1 = 1'
IF (@AnimalTypeId <> 0) SET @SQL = @SQL + ' AND animal_id = @AnimalId'
IF (@ColorId <> 0) SET @SQL = @SQL + ' AND color_id = @ColorId'
EXEC sp_executesql @SQL, '@AnimalId INT, @ColorId INT', @AnimalId, @ColorId
END
GO
var query = context.Table;
int animalId = Convert.ToInt32(ddl_animal.SelectedValue);
if (animalId != 0)
query = query.Where(item => item.animal_id = animalId);
int colorId = Convert.ToInt32(ddl_color.SelectedValue);
if (colorId != 0)
query = query.Where(item => item.color_id = colorId);
SELECT *
FROM table W
WHERE (@AnimalId = 0 OR animal_id = @AnimalId)
AND (@ColorId = 0 OR color_id = @ColorId)
var query = context.Table;
int animalId = Convert.ToInt32(ddl_animal.SelectedValue);
if (animalId != 0)
query = query.Where(item => item.animal_id = animalId);
int colorId = Convert.ToInt32(ddl_color.SelectedValue);
if (colorId != 0)
query = query.Where(item => item.color_id = colorId);