Jag fick några tips kring förbättring av scriptet av en kollega. Det första var att göra om funktionen till en tabell-funktion och sedan använda mig av cross apply. Scriptet ser ut så här för tillfället.
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[SearchRanking]
(
@SearchCriteria varchar(4000),
@Data text
)
RETURNS @RetTable table
(
SearchRanking int
)
AS
BEGIN
DECLARE @SplitOn nvarchar(5)
DECLARE @Counter int
DECLARE @TempTable table
(
SearchWord varchar(4000)
)
SET @SplitOn = ' '
SET @Counter = 1
-- Insert the whole search criteria to the temp table
INSERT INTO @TempTable (SearchWord) VALUES (@SearchCriteria)
-- Split the search criteria just to prepare the insert to the temp table
WHILE (CHARINDEX(@SplitOn,@SearchCriteria)>0)
BEGIN
INSERT INTO @TempTable (SearchWord)
SELECT
Data = LTRIM(RTRIM(SUBSTRING(@SearchCriteria,1,CHARINDEX(@SplitOn, @SearchCriteria)-1)))
SET @SearchCriteria = SUBSTRING(@SearchCriteria,CHARINDEX(@SplitOn,@SearchCriteria )+1,LEN(@SearchCriteria))
SET @Counter = @Counter + 1
END
-- Insert search criterias to temp table
INSERT INTO @TempTable (SearchWord)
SELECT Data = LTRIM(RTRIM(@SearchCriteria))
-- Insert search criterias to return table
INSERT INTO @RetTable (SearchRanking)
SELECT CAST(CAST(COUNT(SearchWord) AS decimal(18,2)) /
CAST((SELECT COUNT(SearchWord) FROM @TempTable) AS decimal(18,2)) AS decimal(18,2)) * 100
FROM @TempTable
WHERE @Data LIKE '%' + SearchWord + '%'
RETURN
END
Anropet ser ut så här:
DECLARE @SearchCriteria varchar(4000)
SET @SearchCriteria = 'SQL performance counters'
DECLARE @TestTable table
(
Data text
)
INSERT INTO @TestTable (Data) VALUES ('Bla bla SQL bla bla performance bla bla')
INSERT INTO @TestTable (Data) VALUES ('Bla bla bla bla')
INSERT INTO @TestTable (Data) VALUES ('SQL')
INSERT INTO @TestTable (Data) VALUES ('Bla bla performance')
INSERT INTO @TestTable (Data) VALUES ('Bla bla sql performance counters bla')
SELECT Data, SearchHitPercent.SearchRanking
FROM @TestTable
CROSS APPLY dbo.SearchRanking (@SearchCriteria, Data) AS SearchHitPercent
WHERE SearchHitPercent.SearchRanking <> 0
ORDER BY SearchHitPercent.SearchRanking DESC
Kommer ni på några andra tips på hur scriptet kan förbättras så hör av er!
