2011-03-23 3 views
1

Мне нужно выполнить поисковый запрос на SQL Server, где мне нужно отфильтровать данные на основе текстового поля ввода пользователя. Проблема заключается в том, что этот запрос необходимо выполнить на нескольких таблицах (поэтому я знаю только столбцы таблицы во время выполнения).SQL-запрос, такой как фильтр

Это запрос, у меня есть:

SELECT * FROM [BTcegeka.C2M].[dbo].[Lookup_Country] WHERE Name LIke '%test%' 

Теперь проблема мне нужно сделать Like функцию на каждом столбце (я знаю только ColumnName во время выполнения) в таблице. Я вызываю этот запрос с веб-сайта ASP.NET. Пользователь выбирает таблицу из выпадающего списка и затем может ввести поле поиска.

Это то, что я действительно хочу сделать:

SELECT * FROM [BTcegeka.C2M].[dbo].[Lookup_Country] WHERE * LIke '%test%' 

Очевидно ', где * Как неисполнению. Как я могу это сделать?

+0

Решение было бы изменить имя столбца во время выполнения - использовать выбранную таблицу и поле поиска (и проверить безопасность, если имена действительны и разрешены). ** edit: ** Пользователь выбирает один столбец для поиска, поэтому при поиске выражения во всех столбцах результат неверен. – MacGucky

+0

И почему вы не можете использовать динамический sql или строку конкатенированных запросов для этого? –

ответ

0

Попробуйте использовать SQL-запрос следующим образом.

SELECT * FROM [BTcegeka.C2M]. [DBO]. [Lookup_Country] ГДЕ COL1 LIKE '% Тест%' ИЛИ Col2 LIKE '% Тест%' ИЛИ COL3 LIKE '% Тест%'

Вы можете использовать И вместо ИЛИ, если это необходимо для вашего требования.

+1

Хотя это возможно, у него есть серьезные проблемы: (а) производительность - как на многих столбцах - плохая идея, если ее можно избежать (б) она действительно не работает должным образом, так как пользователь должен выбрать один столбец, который он хочет поиск (вопрос в некотором роде). – MacGucky

+0

И не удастся, если столбец не может быть прочитан с помощью LIKE. –

+0

Согласен, что у него есть проблемы с производительностью и может быть отсортирован с функцией полнотекстового поиска SQL-сервера. – Shailesh

0

Если вы знаете имена столбцов во время выполнения, то вы должны построить запрос в .NET перед передачей его в sql. Вы можете построить его с правильным именем столбца. Таким образом, вы можете также учитывать тип столбца, в котором вы выполняете поиск. Осторожно, хотя этот путь, выбранный вами, зависит от SQL-инъекции, поэтому перед отправкой запроса на SQL вы должны его проверить.

0

Если вам действительно нужно это сделать, вы можете выполнить поиск в метаданных sqlserver и найти описание выбранной пользовательской таблицы. Сделать хорошее использование этих данных легко и вы можете сделать любой SQL вы хотите с этой информацией, но производительность не пусть, что хороший

0

Вы можете запросить все столбцы в таблице, как:

select name from sys.columns where object_id = object_id('YourTable') 

Тогда вы можете построить запрос, который делает like для каждого столбца.

Другой подход заключается в создании вычисленного столбца с именем SearchField, который содержит конкатенацию всех строк, которые вы хотите найти. Тогда вы можете найти по:

create table #tmp (id int identity, col1 varchar(10), col2 varchar(10), 
    SearchField as col1 + '|' + col2 persisted) 
insert #tmp (col1, col2) values 
    ('alfa', 'beta'), 
    ('gamma', 'DELTA'), 
    ('GAMMA', 'delta') 

select * from #tmp where SearchField like '%alfa%' 
0

Для этого вы должны использовать динамический sql. Ваше имя столбца должно быть передано как параметр этой хранимой процедуры или если вы не хотите создавать хранимую процедуру, просто объявите один параметр и присвойте ему значение, выбранное из раскрывающегося списка, и используйте это в запросе.

create procedure sp_dynamicColumn 
    (
    @columnName varchar(10) 
) 
    as 
    begin 
    declare @DYNAMICSQL nvarchar(4000); 
    SET @DYNAMICSQL = 'Select * from [BTcegeka.C2M].[dbo].[Lookup_Country] where '+ @columnName + ' like ''%test%''' 
    EXECUTE SP_EXECUTESQL @DYNAMICSQL 
    end 
    go 
Смежные вопросы