我正在使用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