標籤:rri 更改 sel vbs proc set 匹配 server ret
CREATE FUNCTION [dbo].[RegexReplace] ( @string VARCHAR(MAX), --被替換的字串 @pattern VARCHAR(255), --替換模板 @replacestr VARCHAR(255), --替換後的字串 @IgnoreCase INT = 0 --0區分大小寫 1不區分大小寫 ) RETURNS VARCHAR(8000) AS BEGIN DECLARE @objRegex INT, @retstr VARCHAR(8000) --建立對象 EXEC sp_OACreate ‘VBScript.RegExp‘, @objRegex OUT --設定屬性 EXEC sp_OASetProperty @objRegex, ‘Pattern‘, @pattern EXEC sp_OASetProperty @objRegex, ‘IgnoreCase‘, @IgnoreCase EXEC sp_OASetProperty @objRegex, ‘Global‘, 1 --執行 EXEC sp_OAMethod @objRegex, ‘Replace‘, @retstr OUT, @string, @replacestr --釋放 EXECUTE sp_OADestroy @objRegex RETURN @retstr END ----保證正常啟動並執行話,需要將Ole Automation Procedures選項置為1 --EXEC sp_configure ‘show advanced options‘, 1 --RECONFIGURE WITH OVERRIDE --EXEC sp_configure ‘Ole Automation Procedures‘, 1 --RECONFIGURE WITH OVERRIDE--匹配字串‘\b字串‘--匹配html/XMl‘\<[^<>]*\>‘--匹配ASCII碼‘[\x01-\x3f]‘ 注意這裡過濾了所有ASCII碼的特殊符號包括?()等根據需求可以自己調節,--SELECT ASCII(‘ ‘) 用於尋找特殊符號的ASCII值--SELECT CHAR(0x03) 用於顯示特殊符號GO
CREATE FUNCTION [dbo].[去除亂碼] ( @str NVARCHAR(100) )RETURNS VARCHAR(100)AS BEGIN RETURN REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(@str, NCHAR(0x00), ‘‘), NCHAR(0x01), ‘‘), NCHAR(0x02), ‘‘), NCHAR(0x03), ‘‘), NCHAR(0x04), ‘‘), NCHAR(0x05), ‘‘), NCHAR(0x06), ‘‘), NCHAR(0x07), ‘‘), NCHAR(0x08), ‘‘), NCHAR(0x0b), ‘‘), NCHAR(0x0c), ‘‘), NCHAR(0x0e), ‘‘), NCHAR(0x0f), ‘‘),NCHAR(0x10), ‘‘), NCHAR(0x11), ‘‘), NCHAR(0x12), ‘‘), NCHAR(0x13), ‘‘), NCHAR(0x14), ‘‘), NCHAR(0x15), ‘‘), NCHAR(0x16), ‘‘), NCHAR(0x17), ‘‘), NCHAR(0x18), ‘‘), NCHAR(0x19), ‘‘), NCHAR(0x1A), ‘‘), NCHAR(0x1B), ‘‘), NCHAR(0x1C), ‘‘),NCHAR(0x1D), ‘‘), NCHAR(0x1E), ‘‘), NCHAR(0x1F), ‘‘), NCHAR(10), ‘‘), NCHAR(32), ‘‘), NCHAR(13), ‘‘), NCHAR(9), ‘‘); END;GO
以上是二種去除資料中亂碼的方式可以根據需求自己更改,第一中利用增則運算式的匹配區間並且需要開啟額外功能(sp_OAcreate功能相當強大可以開啟SQL server調用Web Service),第二種是針對個例的,下面是測試指令碼
SELECT dbo.RegexReplace( ‘成都市武侯0H倎× (? 4普陀區甘泉街道甘泉路241弄25號302室 0‘,‘[\x01-\x20]‘,‘‘,0);SELECT dbo.去除亂碼( ‘成都市武侯0H倎× (? 4普陀區甘泉街道甘泉路241弄25號302室 0‘);SELECT ASCII(‘ ‘)SELECT CHAR(0x03)
另外,摘自網上的SQL Server基本的Regex用法例子
CREATE FUNCTION [dbo].[提取漢字] ( @S NVARCHAR(100) )RETURNS VARCHAR(100)AS BEGIN WHILE PATINDEX(‘%[^吖-座]%‘, @S) > 0 SET @S = STUFF(@S, PATINDEX(‘%[^吖-座]%‘, @S), 1, N‘‘); RETURN @S; END;GOCREATE FUNCTION [dbo].[提取數字] ( @S VARCHAR(100) )RETURNS VARCHAR(100)AS BEGIN WHILE PATINDEX(‘%[^0-9]%‘, @S) > 0 BEGIN SET @S = STUFF(@S, PATINDEX(‘%[^0-9]%‘, @S), 1, ‘‘); END; RETURN @S; END;GOGOCREATE FUNCTION [dbo].[提取字母] ( @S VARCHAR(100) )RETURNS VARCHAR(100)AS BEGIN WHILE PATINDEX(‘%[^a-z]%‘, @S) > 0 BEGIN SET @S = STUFF(@S, PATINDEX(‘%[^a-z]%‘, @S), 1, ‘‘); END; RETURN @S; END;
* Regex符號^在SQL server中在[]外不是匹配第一個字元,這個與一般Regex有所區別,一般Regex^[0-9]意思是匹配第一個是0-9的數字,[^0-9]匹配不是0-9的數字
SQL Server亂碼處理(ASCII)