Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.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
一列上的TSQL动态筛选器_Sql_Sql Server_Variables_Dynamic_Parameters - Fatal编程技术网

一列上的TSQL动态筛选器

一列上的TSQL动态筛选器,sql,sql-server,variables,dynamic,parameters,Sql,Sql Server,Variables,Dynamic,Parameters,要查询的表包含以下列: (name varchar(50),values varchar(50),description varchar(50)). 用户希望为每个名称选择多个名称和一系列值,例如: select * from table where (name = X and value >=1 and value <= 5 ) AND (name = Y and value >=10 and value <= 25 ) AND etc for

要查询的表包含以下列:

(name varchar(50),values varchar(50),description varchar(50)). 
用户希望为每个名称选择多个名称和一系列值,例如:

select * 
from table 
where (name = X and value >=1 and value <= 5 ) 
    AND (name = Y and value >=10 and value <= 25 )
    AND etc for up to 20 factors. 
选择*
从桌子上

其中(name=X,value>=1,value=10,value我在这里做4个假设:

  • 您有SQL Server 2008或更高版本(标记仅为SQL Server)

  • 您的条件将始终采用
    name=Y,value>=10和value的格式。我不知道是否有真正好的方法可以做到这一点,而无需超长的sp或对数据库的多次调用。您是否考虑过只使用代码进行此操作?如果要将其绑定到asp对象,则只需创建一个列表,查询每一行并添加列表的对象然后使用DataSource=list,然后使用DataBind。是的,我将参数选择存储在数据集中,并将其作为表变量传递给存储过程。1,2,4-正确的3.column是varchar,它根据“name”列的类型存储int和char。有没有更好的方法来过滤这样的列?我计划对数值v进行拟合带范围筛选器的值并将其合并查询筛选字符串值(只需选择一个值而不需要选择范围)您的解决方案比我试图解决它的复杂方法简单得多。谢谢!!我真的想不出更好的方法,其他可能是针对不同数据类型的多个列(例如,varcharvalue、intvalue),比较存储为varchar的整数值不起作用,这与
    ABC
    排序在
    B
    之前的方式相同,
    123
    排序在
    2
    之前,即使2明显在123之前。
    CREATE TYPE dbo.TableFilter AS TABLE 
    (   Name        VARCHAR(50), 
        LowerValue  INT, 
        UpperValue  INT
    );
    
    CREATE PROCEDURE dbo.CustomTableFilter @Filter dbo.TableFilter READONLY
    AS
        SELECT  T.*
        FROM    T
        WHERE   EXISTS
                (   SELECT  1
                    FROM    @Filter f
                    WHERE   T.Name = f.Name
                    AND     T.Value >= f.LowerValue 
                    AND     T.Value <= f.UpperValue
                )
    
    DECLARE @Filter dbo.TableFilter;
    INSERT @Filter VALUES ('X', 1, 5), ('Y', 10, 25);
    
    EXECUTE dbo.CustomTableFilter @Filter;