sqlserver對於字串的處理比較弱,replace函式也僅僅支援用字串來作為匹配項,要是需要使用正規表示式,就只能通過系統儲存過程來呼叫vb元件來實現了,下面是兩個寫好的正則函式:
測試是否匹配:
gocreate function dbo.regexismatch
(@source varchar(5000), --需要匹配的源字串
@regexp varchar(1000), --正規表示式
@ignorecase bit = 0 --是否區分大小寫,預設為false
)returns bit --返回結果-false,-true
asbegin
--1(成功),是由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
endexec @hr = sp_oasetproperty @objregexp, 'pattern', @regexp
if @hr <> 0 begin
set @results = 0
return @results
endexec @hr = sp_oasetproperty @objregexp, 'global', false
if @hr <> 0 begin
set @results = 0
return @results
endexec @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
endreturn @results
end正則替換:
go--sql正則替換函式
create function dbo.regexreplace
( @source ntext, --原字串
@regexp varchar(1000), --正規表示式
@replace varchar(1000), --替換值
@globalreplace bit = 1, --是否是全域性替換
@ignorecase bit = 0 --是否忽略大小寫
) returns varchar(1000) as
begin
declare @hr integer
declare @objregexp integer
declare @result varchar(5000)
exec @hr = sp_oacreate 'vbscript.regexp', @objregexp output
if @hr <> 0 begin
exec @hr = sp_oadestroy @objregexp
return null
end
exec @hr = sp_oasetproperty @objregexp, 'pattern', @regexp
if @hr <> 0 begin
exec @hr = sp_oadestroy @objregexp
return null
end
exec @hr = sp_oasetproperty @objregexp, 'global', @globalreplace
if @hr <> 0 begin
exec @hr = sp_oadestroy @objregexp
return null
end
exec @hr = sp_oasetproperty @objregexp, 'ignorecase', @ignorecase
if @hr <> 0 begin
exec @hr = sp_oadestroy @objregexp
return null
end
exec @hr = sp_oamethod @objregexp, 'replace', @result output, @source, @replace
if @hr <> 0 begin
exec @hr = sp_oadestroy @objregexp
return null
end
exec @hr = sp_oadestroy @objregexp
if @hr <> 0 begin
return null
end
return @result
end 關鍵是sp_oacreate,sp_oadestroy,sp_oasetproperty,sp_oamethod這幾個儲存過程的使用,在《編寫擴充套件儲存過程》一文裡也有這個用法。 測試替換函式:print dbo.regexreplace('sfasdf234sdfds', '\d', '', 1, 0) 使用時需要開啟對ole儲存過程的使用: exec sp_configure 'ole automation procedures', 1 reconfigure 在設定此配置時有可能會提示「配置選項'ole automation procedures' 不存在,也可能是高階選項。」的錯誤,解決辦法是在配置之前執行語句: exec sp_configure 'show advanced options',1 reconfigure
在SQL Server中使用索引的技巧
在sql server中,為了查詢效能的優化,有時我們就需要對資料表通過建立索引的方式,目的主要是根據查詢要求,迅速縮小查詢範圍,避免全表掃瞄。索引有兩種型別,分別是聚集索引 clustered index,也稱聚類索引 簇集索引 和非聚集索引 nonclustered index,也稱非聚類索引 ...
SQL Server 2000 中使用正規表示式
這兩天有個需求,需要在資料庫中判斷字串的格式,於是從網上蒐集了一些資料,整理了一下。下面這個是乙個自定義函式,使用者可以呼叫這個函式判斷指定的字串是否符合正規表示式的規則.create function dbo.find regular expression source varchar 5000 ...
SQL Server 2000 中使用正規表示式
這兩天有個需求,需要在資料庫中判斷字串的格式,於是從網上蒐集了一些資料,整理了一下。下面這個是乙個自定義函式,使用者可以呼叫這個函式判斷指定的字串是否符合正規表示式的規則.createfunctiondbo.find regular expression sourcevarchar 5000 需要匹...