首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SSRS多关键字搜索

SSRS多关键字搜索
EN

Stack Overflow用户
提问于 2014-02-19 14:24:15
回答 3查看 1.4K关注 0票数 0

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-02-19 23:34:32

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

代码语言:javascript
复制
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

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

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

代码语言:javascript
复制
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

如果执行,这将给出以下结果:

代码语言:javascript
复制
PRINT @query

从CarData选择CarName,其中CarName喜欢'%2005%‘,CarName喜欢'%Ford%’,CarName喜欢'%Escape%'

最后一步是创建一个表,然后在表中执行@query变量。

代码语言:javascript
复制
CREATE TABLE #temp
(
CarName VARCHAR(250)
)

INSERT INTO #temp
EXEC(@query)

SELECT * FROM #temp

DROP TABLE #temp
票数 0
EN

Stack Overflow用户

发布于 2014-02-20 08:58:38

尝试创建一个简单的SQL查询,如下所示

代码语言:javascript
复制
select * from Cars where CarBrand like '%' + @Name + '%'

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

票数 0
EN

Stack Overflow用户

发布于 2014-02-21 03:49:47

这里有一个非常简单的解决方案。您可以通过将搜索字符串中的空格替换为'union‘字符串来创建动态SQL字符串,这样搜索字符串中的每个单词都会在表变量中获得记录。然后将表变量加入到car表中:

代码语言:javascript
复制
-- 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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21883329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档