2011-03-23 207 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