2015-04-08 4 views
3

Я пытаюсь достичь расширенного поиск функциональности для моего приложения, в котором я иметь SQL таблицу оцененную параметр в следующей структуре,Loop через 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. К (Дата)
+1

Просто создайте запрос на клиенте. – usr

+1

Как ваши фильтры связаны друг с другом? используя 'AND' или' OR' – ughai

+0

@ughai: Это И – iamCR

ответ

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 
0

Создайте свой atement, а затем выполнить его, как, например:

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