0

我有一个页面,用户在其中动态添加搜索条件以过滤掉记录。我将这些条件发送到 TVP 中的存储过程。现在我需要编写一个查询,将这些过滤器用作“AND”而不是“OR”

考虑一个学生表的例子

ID          Name         Marks
----------- ---------    -------
2           bab          65
4           bad          75
6           baf          85

我在 TVP 中获得了 Stored proc 的条件(我正在发送列和运算符的 ID,但为了清楚起见,我在本示例中使用了列名和运算符)

 Column     Operator    Value
----------- ---------   -------
Name        Contains    a
Marks       >=          75

现在我需要使用这个 TVP 从学生表中过滤掉记录,在这个例子中,学生表的最后 2 行将显示给用户。

谁能帮我写一个查询,我尝试在学生表和TVP之间进行交叉连接,但查询是ORing而不是TVP中的条件

示例查询:

    DECLARE @tmpCond TABLE
(
    ColumnId SMALLINT,
    OperatorId SMALLINT,
    Value VARCHAR(10)
)

INSERT INTO @tmpCond
        ( ColumnId ,
          OperatorId ,
          Value
        )
VALUES  ( 1,1,'a')
        ,(2,2,'75')

SELECT * FROM dbo.Student A
CROSS JOIN @tmpCond B
WHERE 
    (B.ColumnId = 1 AND B.OperatorId = 1 AND A.NAME LIKE '%'+B.Value+'%')
    OR
    (B.ColumnId = 2 AND B.OperatorId = 2 AND A.Marks >= B.Value)
4

1 回答 1

1

您需要执行以下操作:

  1. 将初步查询创建为 string,缺少 where 参数:query = 'select * from student where xxx order by name, marks'。我们将替换xxx为适当的内容。
  2. 为查询部分创建一个变量where_part = ''
  3. 使用游标遍历 TVP 中的每一行
  4. 对于column, operator, valueTVP 中的每个,构建一个类似的字符串name + operator + value + ' and '并将其附加到where_part.
  5. 从 TVP 处理完所有行后,删除最后一个' and ',在这个意义上:'条件和条件和条件'。
  6. 替换'xxx'query_where_part
  7. 运行exec(@query)(tsql,其他数据库有不同的语法)。另请参阅本文和 google 以获取“存储过程中的动态 sql”。
于 2012-04-30T06:09:32.543 回答