SSRS多个关键字搜索

时间:2014-02-19 14:24:16

标签: sql-server sql-server-2008 reporting-services sql-server-2008-r2 ssrs-2008

我正在使用SSRS 2008.我有一份报告,我希望用户能够在搜索块中输入任意数量的关键字,以便根据数据集检查,无论数据集中的单词位置如何。例如,如果他们搜索2005 Ford Escort,它应该返回所有包含字符串中所有三个单词的记录,而不一定按照输入的顺序返回。

3 个答案:

答案 0 :(得分:0)

这可以使用动态SQL来完成。如果您能够创建自己的函数,则可以创建一个函数,将输入的每个单词的参数输入拆分为不同的行(注意:每个单词必须用空格分隔才能使函数正常工作)

Create FUNCTION [dbo].[SplitString] ( @stringToSplit VARCHAR(MAX) )
RETURNS
@returnList TABLE ([Name] [nvarchar] (500))
AS
BEGIN

DECLARE @name NVARCHAR(255)
DECLARE @pos INT

WHILE CHARINDEX(' ', @stringToSplit) > 0
 BEGIN
  SELECT @pos  = CHARINDEX(' ', @stringToSplit)  
  SELECT @name = SUBSTRING(@stringToSplit, 1, @pos-1)

  INSERT INTO @returnList 
  SELECT '%' + CAST(@name AS VARCHAR(255)) + '%'

  SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+1, LEN(@stringToSplit)-@pos)
 END

 INSERT INTO @returnList
SELECT '%' + CAST(@stringToSplit AS VARCHAR(255)) + '%'

 RETURN
END

如果输入'2005 Ford Escape',则返回3行,每个单词用空格分隔1。现在,您可以使用动态SQL为函数返回的行数创建查询,结果将是您要报告的结果。

(我确信这个动态SQL可以重写为更干净,但下面的解决方案将为您提供所需的答案/逻辑)

DECLARE @query VARCHAR(MAX)
DECLARE @query2 VARCHAR(MAX)

SET @query = ''
SET @query2 = ''

SELECT @query =
'
Select CarName from CarData
'
FROM dbo.SplitString('2005 Ford Escape')

SELECT @query2 = @query2 + 
'
and CarName like ''' + name + '''
'
FROM dbo.SplitString('2005 Ford Escape')

SET @query2 = STUFF(@query2,1,5,'where')

SET @query = @query + @query2

如果您执行以下操作,将会给您以下结果:

PRINT @query

从CarData中选择CarName 其中CarName喜欢'%2005%' 和CarName一样'%Ford%' 和CarName类似'%Escape%'

最后一步是创建一个您将报告的表,并在表中执行@query变量。

CREATE TABLE #temp
(
CarName VARCHAR(250)
)

INSERT INTO #temp
EXEC(@query)

SELECT * FROM #temp

DROP TABLE #temp

答案 1 :(得分:0)

尝试创建一个简单的SQL查询,就像这样

select * from Cars where CarBrand like '%' + @Name + '%'

这将显示与您的关键字名称匹配的所有数据。

答案 2 :(得分:0)

这是一个非常简单的解决方案。您可以通过使用“union select”字符串替换搜索字符串中的空格来创建动态SQL字符串,以便搜索字符串中的每个单词都获取表变量中的记录。然后将表变量加入汽车表:

-- load test data
declare @cars table(car varchar(50))
insert into @cars values
    ('Ford Escape 2005'),
    ('Ford 2005 Escape'),
    ('Escape 2005 Ford'),
    ('Escape Ford 2005'),
    ('2005 Ford Escape'),
    ('2005 Escape Ford'),
    ('Some 2005 Other Escape text Ford in here'),
    ('This is not the 2005 Ford you are looking for'),
    ('Neither is this Ford Escape with no Year')

-- get search string values into table
declare @search table(string varchar(50))
declare @sql nvarchar(max), @string nvarchar(50)
set @string = '2005 Ford Escape' -- this is your user parameter
set @sql = 'select ''' + replace(ltrim(rtrim(@string)),' ',''' union select ''') + ''''
insert into @search
exec(@sql)

-- return matching car records
select
    c.car
from @cars c
    inner join @search s
        on c.car like '%' + s.string + '%'
group by
    c.car
having count(*) = (select count(*) from @search) -- every search string record must match the car value