我正在使用SSRS 2008。我有一份报告,希望用户能够在搜索块中输入任意数量的关键字,以便对照数据集进行检查,而不管数据集中的单词位置如何。例如,如果他们搜索2005年福特护航,它应该返回所有的记录,在字符串中的所有三个字,不一定按顺序输入。
发布于 2014-02-19 23:34:32
这可以使用动态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这将返回3行,如果您输入'2005福特逃逸‘,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发布于 2014-02-20 08:58:38
尝试创建一个简单的SQL查询,如下所示
select * from Cars where CarBrand like '%' + @Name + '%'这将显示与关键字名称匹配的所有数据。
发布于 2014-02-21 03:49:47
这里有一个非常简单的解决方案。您可以通过将搜索字符串中的空格替换为'union‘字符串来创建动态SQL字符串,这样搜索字符串中的每个单词都会在表变量中获得记录。然后将表变量加入到car表中:
-- 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 valuehttps://stackoverflow.com/questions/21883329
复制相似问题