mssql 使用正則表達式


這兩天有個需求,需要在數據庫中判斷字符串的格式,於是從網上搜集了一些資料,整理了一下。

下面這個是一個自定義函數,用戶可以調用這個函數判斷指定的字符串是否符合正則表達式的規則.
CREATE FUNCTION dbo.find_regular_expression
 (
  @source varchar(5000),   --需要匹配的源字符串
  @regexp varchar(1000),  --正則表達式
  @ignorecase bit = 0  --是否區分大小寫,默認為false
 )
RETURNS bit  --返回結果0-false,1-true
AS
 BEGIN

 --0(成功)或非零數字(失敗),是由 OLE 自動化對象返回的 HRESULT 的整數值。
  DECLARE @hr integer 

--用於保存返回的對象令牌,以便之后對該對象進行操作
  DECLARE @objRegExp integer   DECLARE @objMatches integer

--保存結果
  DECLARE @results bit
  
/*
創建 OLE 對象實例,只有 sysadmin 固定服務器角色的成員才能執行 sp_OACreate,並確定機器中有VBScript.RegExp類庫
*/
  EXEC @hr = sp_OACreate 'VBScript.RegExp', @objRegExp OUTPUT
  IF @hr <> 0 BEGIN
   SET @results = 0
   RETURN @results
  END
/*
以下三個分別是設置新建對象的三個屬性。下面是'VBScript.RegExp'中常用的屬性舉例:
    Dim regEx,Match,Matches         '建立變量。
    Set regEx = New RegExp         '建立一般表達式。
    regEx.Pattern= patrn         '設置模式。
    regEx.IgnoreCase = True         '設置是否區分大小寫。
    regEx.Global=True                             '設置全局可用性。
    set Matches=regEx.Execute(string)             '重復匹配集合
    RegExpTest = regEx.Execute(strng)      '執行搜索。
   for each match in matches                    '重復匹配集合
   RetStr=RetStr &"Match found at position "
   RetStr=RetStr&Match.FirstIndex&".Match Value is '"
   RetStr=RetStr&Match.Value&"'."&vbCRLF Next
   RegExpTest=RetStr

*/
  EXEC @hr = sp_OASetProperty @objRegExp, 'Pattern', @regexp
  IF @hr <> 0 BEGIN
   SET @results = 0
   RETURN @results
  END
  EXEC @hr = sp_OASetProperty @objRegExp, 'Global', false
  IF @hr <> 0 BEGIN
   SET @results = 0
   RETURN @results
  END
  EXEC @hr = sp_OASetProperty @objRegExp, 'IgnoreCase', @ignorecase
  IF @hr <> 0 BEGIN
   SET @results = 0
   RETURN @results
  END 
--調用對象方法
  EXEC @hr = sp_OAMethod @objRegExp, 'Test', @results OUTPUT, @source
  IF @hr <> 0 BEGIN
   SET @results = 0
   RETURN @results
  END
--釋放已創建的 OLE 對象
  EXEC @hr = sp_OADestroy @objRegExp
  IF @hr <> 0 BEGIN
   SET @results = 0
   RETURN @results
  END
 RETURN @results
 END

下面是一個簡單的測試sql語句,可以直接在查詢分析器中運行。
DECLARE @intLength AS INTEGER
DECLARE @vchRegularExpression AS VARCHAR(50)
DECLARE @vchSourceString as VARCHAR(50)
DECLARE @vchSourceString2 as VARCHAR(50)
DECLARE @bitHasNoSpecialCharacters as BIT

-- 初始化變量
SET @vchSourceString = 'Test one This is a test!!'
SET @vchSourceString2 = 'Test two This is a test'

-- 我們的正則表達式應該類似於
-- [a-zA-Z ]{}
-- 如: [a-zA-Z ]{10}  ...  一個十字符的字符串

-- 獲得字符串長度
SET @intLength = LEN(@vchSourceString)

-- 設置完整的正則表達式
SET @vchRegularExpression = '[a-zA-Z ]{' + CAST(@intLength as varchar) + '}'

-- 是否有任何特殊字符
SET @bitHasNoSpecialCharacters = dbo.find_regular_expression(@vchSourceString, @vchRegularExpression,0)

PRINT @vchSourceString
IF @bitHasNoSpecialCharacters = 1 BEGIN
 PRINT 'No special characters.'
END ELSE BEGIN
 PRINT 'Special characters found.'
END

PRINT '**************'

-- 獲得字符串長度
SET @intLength = LEN(@vchSourceString2)

-- 設置完整的正則表達式
SET @vchRegularExpression = '[a-zA-Z ]{' + CAST(@intLength as varchar) + '}'

-- 是否有任何特殊字符
SET @bitHasNoSpecialCharacters = dbo.find_regular_expression(@vchSourceString2, @vchRegularExpression,0)

PRINT @vchSourceString2
IF @bitHasNoSpecialCharacters = 1 BEGIN
 PRINT 'No special characters.'
END ELSE BEGIN
 PRINT 'Special characters found.'
END

GO


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM