【问题标题】:Loop through SQL Table valued parameter循环遍历 SQL 表值参数
【发布时间】:2015-04-08 10:59:26
【问题描述】:

我正在尝试为我的应用程序实现高级搜索功能,其中我在以下结构中有一个 SQL 表值参数,

ColumnName   Operator       Keyword
------------------------------------
Name          StartsWith     Ram
City          Equals         Chennai

我的SQL 表,

Name         City      CreatedDate
-----------------------------------
Ram          Chennai   10/10/2014
Ramachan     Kovai     02/03/2015

我如何循环遍历这个TVP,以便我可以构建WHERE 子句并将其附加到SELECT 查询中,因为我有大约10 行搜索值(条件),所以速度更快。

过滤器与AND 运算符相关联。

使用的运算符列表:

  1. 等于
  2. 不等于
  3. 开始于
  4. 结尾
  5. 从(日期)
  6. 至(日期)

【问题讨论】:

  • 只需在客户端构建查询。
  • 您的过滤器是如何相互关联的?使用ANDOR

标签: sql-server dynamic-sql table-valued-parameters


【解决方案1】:

您可以创建一个如下所示的动态过滤表达式并在您的 SQL 中使用它。在 TVP 中添加编辑过滤器并针对相应的数据类型进行验证时,您需要非常小心

使用数据创建类型和基表

/*
CREATE TYPE FilterTVP AS TABLE
(
ColumnName VARCHAR(30), Operator VARCHAR(30), Keyword VARCHAR(30)
);
GO

CREATE TABLE myTable
(
    Name VARCHAR(50),
    City VARCHAR(50),
    CreatedDate DATE
)
INSERT INTO myTable VALUES('Ram','Chennai','10/10/2014'),('Ramachan','Kovai','02/03/2015')

*/

查询

DECLARE @Param FilterTVP
INSERT INTO @Param VALUES('Name','StartsWith','Ram'),('City','Equals','Chennai'),('CreatedDate','From','2014-05-05')
DECLARE @FilterExp NVARCHAR(MAX) 
SELECT @FilterExp = 
(SELECT
    ' AND ' + QUOTENAME(ColumnName,'[') + ' ' + 
    CASE Operator 
        WHEN 'Equals'
        THEN '='
        WHEN 'Not equals'
        THEN '<>'
        WHEN 'StartsWith'
        THEN 'LIKE'
        WHEN 'Endswith'
        THEN 'LIKE'
        WHEN 'From'
        THEN '>='
        WHEN 'To'
        THEN '<='

    END + ' ' +
    CASE
        WHEN Operator = 'Startswith' THEN  QUOTENAME(Keyword  + '%','''') 
        WHEN Operator = 'Endswith' THEN QUOTENAME('%' + Keyword  ,'''') 
        ELSE QUOTENAME(Keyword,'''')
    END
FROM @Param
FOR XML PATH(''),TYPE).value('.','NVARCHAR(MAX)')



SET @FilterExp = 'SELECT * FROM  myTable WHERE 1=1 ' + ISNULL(@FilterExp,'')

PRINT @FilterExp
EXEC sp_executeSQL @FilterExp

输出

SQL Fiddle

Name    City    CreatedDate
--------------------------
Ram Chennai 2014-10-10

【讨论】:

    【解决方案2】:

    构建您的语句,然后执行它,例如:

    CREATE TABLE f
        (
          ColumnName NVARCHAR(MAX) ,
          Operator NVARCHAR(MAX) ,
          KeyWord NVARCHAR(MAX)
        )
    CREATE TABLE t
        (
          Name NVARCHAR(MAX) ,
          City NVARCHAR(MAX)
        )
    
    INSERT  INTO f
    VALUES  ( 'Name', 'StartsWith', 'Ram' ),
            ( 'City', 'Equals', 'Chennai' )
    
    
    INSERT  INTO t
    VALUES  ( 'Ram', 'Chennai' ),
            ( 'Ramachan', 'Kovai' )
    
    
    DECLARE @op NVARCHAR(MAX) ,
        @v NVARCHAR(MAX)
    DECLARE @statement NVARCHAR(MAX) = 'SELECT * FROM t WHERE Name ' 
    
    SELECT  @op = Operator ,
            @v = KeyWord
    FROM    f
    WHERE   ColumnName = 'Name'
    
    SET @statement = @statement + CASE @op
                                    WHEN 'StartsWith' THEN 'LIKE ''' + @v + '%'''
                                    ELSE ' = ''' + @v + ''''
                                  END + ' AND City'
    
    
    SELECT  @op = Operator ,
            @v = KeyWord
    FROM    f
    WHERE   ColumnName = 'City'
    
    SET @statement = @statement + CASE @op
                                    WHEN 'StartsWith' THEN 'LIKE ''%' + @v + '%'''
                                    ELSE ' = ''' + @v + ''''
                                  END
    
    EXEC(@statement)
    

    输出:

    Name    City
    Ram     Chennai
    

    【讨论】:

      猜你喜欢
      • 2020-12-18
      • 2018-12-06
      • 1970-01-01
      • 1970-01-01
      • 2015-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-13
      相关资源
      最近更新 更多