2011-03-23 145 views
1

我需要在SQL Server中執行搜索查詢,我需要根據用戶輸入文本字段過濾數據。 問題是,這個查詢需要在多個表上執行(所以我只知道運行時的表列)。像過濾器SQL查詢

這是查詢我:

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

現在的問題是我需要做的每一行的功能一樣(我只知道在運行時的列名)在表中。我從ASP.NET網站調用此查詢。用戶從下拉列表中選擇一個表格,然後可以輸入搜索字段。

這是我真正要完成的任務:

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

顯然,「凡·贊」失敗。我怎樣才能做到這一點?

+0

解決方法是在運行時更改列名 - 使用選定的表和搜索字段(並檢查名稱是否有效且允許的安全性)。 **編輯:**用戶選擇一列進行搜索,所以如果在所有列中搜索表達式,結果是錯誤的。 – MacGucky 2011-03-23 12:59:29

+0

爲什麼你不能使用動態SQL或連接查詢字符串呢? – 2011-03-23 13:15:15

回答

0

嘗試使用像這樣的SQL查詢。

SELECT * FROM [BTcegeka.C2M] [DBO]。[Lookup_Country] WHERE COL1 LIKE '%測試%' OR COL2 LIKE '%測試%' OR COL3 LIKE '%測試%'

如果您的需求需要,您可以使用AND而不是OR。

+1

雖然這是可能的,但它存在一些主要問題:(a)性能 - 像許多列一樣是一個壞主意,如果可以避免的話(b)它不能真正以所需的方式工作,因爲用戶應該選擇他想要的一列搜索(以某種方式錯誤的問題)。 – MacGucky 2011-03-23 13:02:26

+0

如果列與LIKE不可搜索,將會失敗。 – 2011-03-23 13:11:35

+0

同意它有性能問題,可以使用SQL服務器的全文搜索功能進行排序。 – Shailesh 2011-03-23 13:30:16

0

如果您在運行時知道列名,那麼在將它傳遞給sql之前,您應該在.NET中構建您的查詢。您可以使用正確的列名稱來構建它。通過這種方式,您也可以考慮您要搜索的列的類型。 請注意,您選擇的這個路徑很容易發生SQL注入,因此在向SQL發送查詢之前,應該檢查它。

0

如果您確實需要這樣做,您可以在sqlserver meta表中搜索並找到所選用戶表的描述。很好地利用這些數據是很簡單的,你可以讓你想用該信息的任何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