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