簡體   English   中英

在 SQL Server 中計算字符串出現次數的函數

[英]Function to count string occurrences in SQL Server

我有一個表,其中包含一個列 (error_message),它注冊了來自我的一個業務應用程序的所有錯誤消息。 此應用程序每天生成的行數非常大。

我想編寫一個通用函數來計算 error_message 列中某些單詞(例如單詞“timeout”)的出現次數。 該函數也必須與其他列一起使用。 返回值應該是 INT(因為它是一個計數)。

有沒有人可以幫助我完成這樣的功能以及如何使用它?

此代碼可以幫助您

IF OBJECT_ID('dbo.ErrorLog')IS NOT NULL
    DROP TABLE ErrorLog;

CREATE table ErrorLog(Id Int Identity,[error_message] Varchar(500));
Insert into ErrorLog([error_message])
SELECT 'timeout error'      Union all
SELECT 'error at Procedure' Union all
SELECT 'timeout error'      Union all
SELECT 'Function error'     Union all
SELECT 'timeout error';

--IF OBJECT_ID('dbo.ufn_ErrorCount')IS NOT NULL
--DROP FUNCTION ufn_ErrorCount

CREATE FUNCTION dbo.ufn_ErrorCount 
(
@InputErrorType Varchar(50)
)
RETURNS INT
Begin
    Declare @ErrorCOUNT INT;

    SELECT @ErrorCOUNT=COUNT([error_message])  From ErrorLog
    WHERE CHARINDEX(@InputErrorType,[error_message])>0;

RETURN @ErrorCOUNT;
END;

--Calling a Function
SELECT [dbo].[ufn_ErrorCount] ('timeout') AS ErrorCount;
GO

你可以用這樣的查詢來做到這一點

select  count(*)
from    yourTable
where   lower(error_message) like '%timeout%';

您可以將該查詢放在一個函數中,該函數將搜索字符串列作為參數並將計數作為整數返回,如下所示

CREATE FUNCTION ReturnSite (
    @search_column VARCHAR(50),
    @search_string VARCHAR(50)
) RETURNS INT AS
BEGIN
    DECLARE @count INT;

    select  @count = count(*)
    from    yourTable
    where   lower(@search_column) like '%' + @search_string + '%';

    RETURN @count;
END;

更好的方法是使用內聯表值函數 (iTVF)。 標量 UDF 性能很差,會終止並行處理,但 iTVF 不會。

讓我們使用這個示例數據(與上面相同,但還有一些示例記錄):

-- Sample Data
IF OBJECT_ID('dbo.itvf_ErrorLogWordCount') IS NOT NULL 
  DROP FUNCTION dbo.itvf_ErrorLogWordCount;
IF OBJECT_ID('dbo.ErrorLog') IS NOT NULL 
  DROP TABLE dbo.ErrorLog;
GO

CREATE table ErrorLog(Id Int Identity,[error_message] Varchar(500))
Insert into ErrorLog([error_message])
SELECT 'timeout error'      UNION ALL
SELECT 'error at Procedure' UNION ALL
SELECT 'timeout error'      UNION ALL
SELECT 'Function error'     UNION ALL
SELECT 'timeout error'      UNION ALL
SELECT 'Memory leak'        UNION ALL
SELECT 'CPU Fault';
GO

功能:

-- The function    
CREATE FUNCTION dbo.itvf_ErrorLogWordCount(@SearchString varchar(100))
RETURNS TABLE WITH SCHEMABINDING AS RETURN
SELECT 
  SearchString = @SearchString,  
  total        = COUNT(*) 
FROM dbo.ErrorLog
WHERE error_message LIKE '%'+@SearchString+'%';
GO

自主使用:

SELECT SearchString, Total 
FROM dbo.itvf_ErrorLogWordCount('timeout');

結果:

SearchString  Total
------------- ------
timeout       3

針對一系列值:

WITH searchWords(SearchString) AS 
(
  SELECT 'error'   UNION ALL 
  SELECT 'timeout' UNION ALL 
  SELECT 'fault'   UNION ALL 
  SELECT 'leak'
)
SELECT ss.* 
FROM searchWords
CROSS APPLY dbo.itvf_ErrorLogWordCount(SearchString) ss;

結果:

SearchString  total
------------- -----------
error         5
timeout       3
fault         1
leak          1
--if you want to check different columns
CREATE FUNCTION function_name
( @parameter_name VARCHAR(50) 
  @parameter_value VARCHAR(50)   
)

RETURNS INT

AS

BEGIN

   DECLARE @count INT;

   --executable_section
   Select @count=count(*) from table_name where @parameter_name like '%'+@parameter_value+'%';

   RETURN @count;

END;

--if you want to use the same column but different value  
CREATE FUNCTION function_name
( 
  @parameter VARCHAR(50)  
)

RETURNS INT

AS

BEGIN

   DECLARE @count INT;

   --executable_section
   Select @count=count(*) from table_name where error_message like '%'+@parameter_value+'%';

   RETURN @count;

END;
CREATE FUNCTION dbo.CountOccurrencesOfString
(
    @searchTerm nvarchar(max)
)
RETURNS INT
AS
BEGIN
    DECLARE @count INT;
    SELECT @count=COUNT([error_message])  From table
        WHERE CHARINDEX(@searchTerm, [error_message]) > 0;
    return @count;
END;

希望它會幫助你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM