Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何根据值使用或忽略SQL存储过程中的参数_Sql_Asp.net - Fatal编程技术网

如何根据值使用或忽略SQL存储过程中的参数

如何根据值使用或忽略SQL存储过程中的参数,sql,asp.net,Sql,Asp.net,我有几个下拉列表,在前端有项值对。假设在第一个ddl(动物)中,狗的值为1,猫的值为2,任意值为0,在第二个ddl(颜色)中,黑色的值为1,白色的值为2,任意值为0 此外,我还想使用存储过程通过下拉列表中选择的值从db中选择数据 因此,只有在值为的情况下才应过滤结果!=0如果为0,则不应过滤结果。 我所能想到的最佳解决方案是在代码端创建SELECT查询(不带SP): 但这足够好吗?或者有更好的方法来实现这一点,例如在SP端?以某种方式使用默认值? 提前谢谢 您的解决方案应该可以工作,但如果您愿意

我有几个下拉列表,在前端有项值对。假设在第一个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
  • 将LINQ2SQL与EntityFramework一起使用

    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);