0

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

回答

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)[email protected]) 
END 

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

RETURN 
END 

如果您输入'2005 Ford Escape',则每返回一个空格,则返回3行。现在,您可以使用动态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 

选择CarName从CarData 其中CarName LIKE '%2005%' 和CarName LIKE '%福特%' 和CarName LIKE '%逃生%'

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

CREATE TABLE #temp 
(
CarName VARCHAR(250) 
) 

INSERT INTO #temp 
EXEC(@query) 

SELECT * FROM #temp 

DROP TABLE #temp 
+0

我添加了顶部列出的功能。我创建了一个存储过程,但它给了我一个错误:和VehicleInformation像'''+ name +'''。这里是我用过的: – swhetsell

+0

'PROCEDURE [dbo]。[usp_VehicleSearch] @SearchString as VarChar(MAX) \t SET NOCOUNT ON; \t DECLARE @query VARCHAR(MAX) \t DECLARE @ QUERY2 VARCHAR(MAX) \t SET @query = '' \t SET @ QUERY2 = '' \t SELECT @query = \t' \t选择* from dbo.vwVehicles \t' \t FROM dbo。SplitString(@SearchString) \t SELECT @ QUERY2 = @ QUERY2 + \t ' \t和VehicleInformation像 ''' +名称+ '' ' \t' \t FROM dbo.SplitString(@SearchString) \t SET @ QUERY2 = STUFF(@ query2,1,5 '其中') \t SET @query = @query + @ QUERY2 \t \t CREATE TABLE #TEMP \t( \t CarName VARCH AR(250) \t) \t INSERT INTO #TEMP \t EXEC(@query) \t SELECT * FROM #TEMP \t DROP TABLE #TEMP END' – swhetsell

+0

取出末尾的 'END'的脚本。另外,你的STUFF函数应该替换4个字符,而不是5. STUFF(@ query2,1,4,'where')。像你上面写的那样,检查你的工作的一个好方法就是PRINT @query。通常阅读动态SQL可能是一个好主意,这样您就可以更自如地尝试使用它。 – Pops

0

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

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

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

+1

此答复适用于单个关键字或字符串,但不能将字符串分解为多个关键字。 – swhetsell

+0

你有没有试过用'OR' – user1647667

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