我正在使用SSRS 2008.我有一份报告,我希望用户能够在搜索块中输入任意数量的关键字,以便根据数据集进行检查,而不管字词位置在数据集。例如,如果他们搜索2005福特Escort,它应该返回字符串中包含全部三个单词的所有记录,而不一定按照输入的顺序。SSRS多关键字搜索
回答
这可以使用动态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
尝试创建一个简单的SQL查询就这样
select * from Cars where CarBrand like '%' + @Name + '%'
这将显示您的关键字的名称相匹配的所有数据。
此答复适用于单个关键字或字符串,但不能将字符串分解为多个关键字。 – swhetsell
你有没有试过用'OR' – user1647667
这是一个非常简单的解决方案。您可以通过用'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
- 1. 多关键字搜索
- 2. 多个关键字搜索
- 3. Linq多关键字搜索
- 4. MySQL和多关键字多行搜索
- 5. 关键字搜索
- 6. 关键字搜索
- 7. 关键字搜索
- 8. 搜索关键字
- 9. SQL中的多关键字搜索
- 10. 使用多个关键字搜索
- 11. 跨多列的mysql关键字搜索
- 12. SELECT2多个搜索关键字
- 13. 搜索多个关键字的文本
- 14. 插入并搜索多个关键字
- 15. xpath搜索多个关键字
- 16. PHP MySqli多个关键字搜索
- 17. 搜索,通过使许多关键字
- 18. 多个条件关键字搜索
- 19. Java通过多个关键字搜索
- 20. MySQL和PHP:多关键字搜索
- 21. 在多列中搜索关键字
- 22. LINQ多个关键字搜索PagedList
- 23. MySQL搜索匹配多个关键字
- 24. 搜索多个关键字与tweetsharp
- 25. 通过关键字搜索多个
- 26. 全文搜索多个关键字
- 27. 按关键字搜索按类别搜索按名称搜索关键字
- 28. 搜索多个关键词
- 29. 通过mysql查询搜索关键字的搜索关键字来计算搜索关键字
- 30. PHP搜索引擎 - 搜索多个关键字
我添加了顶部列出的功能。我创建了一个存储过程,但它给了我一个错误:和VehicleInformation像'''+ name +'''。这里是我用过的: – swhetsell
'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
取出末尾的 'END'的脚本。另外,你的STUFF函数应该替换4个字符,而不是5. STUFF(@ query2,1,4,'where')。像你上面写的那样,检查你的工作的一个好方法就是PRINT @query。通常阅读动态SQL可能是一个好主意,这样您就可以更自如地尝试使用它。 – Pops