我需要在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'失败了。我怎么能做到这一点?
答案 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