SQL查询,如过滤器

时间:2011-03-23 12:54:11

标签: sql

我需要在SQL Server中执行搜索查询,我需要根据用户输入文本字段过滤掉数据。 问题是,这个查询需要在几个表上执行(所以我只在运行时知道tablecolumns)。

这是我的查询:

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

现在问题是我需要在表中的每一列(我只知道运行时的列名)上执行Like函数。我从ASP.NET网站调用此查询。用户从下拉列表中选择一个表,然后可以进入搜索字段。

这是我真正想要完成的事情:

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

显然'Where * Like'失败了。我怎么能做到这一点?

5 个答案:

答案 0 :(得分:1)

您可以查询表格中的所有列,如:

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%'

答案 1 :(得分:0)

尝试使用这样的SQL查询。

SELECT * FROM [BTcegeka.C2M]。[dbo]。[Lookup_Country] 哪里  COL1 LIke'%test%'  或COL2 LIke'%test%'  或COL3 LIke'%test%'

如果您的要求需要,可以使用AND代替OR。

答案 2 :(得分:0)

如果您在运行时知道列名,那么您应该在将查询传递给sql之前在.NET中构建查询。您可以使用正确的列名称构建它。这样,您还可以考虑搜索列的类型。 虽然你选择的这个路径很容易注入SQL,但是在向SQL发送查询之前你应该检查它。

答案 3 :(得分:0)

如果您确实需要这样做,您可以搜索sqlserver元表并查找所选用户表的描述。充分利用这些数据很容易,你可以使用这些信息制作你想要的任何sql,但性能可能不是那么好

答案 4 :(得分: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