注:必须先下载 sqlclr的dll文件, 配合脚本安装到库中。下载地址:
点击打开链接
结果:
--请注意!!!!!
--A. 请将 [master] 替换为当前库
--B. 请将主程序集的dll路径替换为当前库中的路径
--C. 出现错误:在 master 数据库中记录的数据库所有者 SID 与在数据库 'dbName' 中记录的数据库所有者 SID 不同。
-- 应该通过使用 ALTER AUTHORIZATION 语句重置数据库 'db_Study' 的所有者来更正此情况。
-- Sp_changedbowner 'sa',true
USE [master]
GO
--1. 在SQL Server中启用CLR
exec sp_configure 'clr enabled', 1
reconfigure;
go
--2. 在目标库 [master] 设置TRUSTWORTHY为ON
ALTER DATABASE [master] SET TRUSTWORTHY ON
--3. 删除主程序集已有对象db
IF OBJECT_ID('[dbo].[Fun_DBA_IsMatch]') IS NOT NULL
DROP FUNCTION [dbo].[Fun_DBA_IsMatch]
GO
IF OBJECT_ID('[dbo].[Fun_DBA_IsChinese]') IS NOT NULL
DROP FUNCTION [dbo].[Fun_DBA_IsChinese]
GO
IF OBJECT_ID('[dbo].[Fun_DBA_GetHTML]') IS NOT NULL
DROP FUNCTION [dbo].[Fun_DBA_GetHTML]
GO
IF OBJECT_ID('Fun_SplitChineseAndEnglish') IS NOT NULL
DROP FUNCTION Fun_SplitChineseAndEnglish
GO
--4. 删除主程序集 SqlClr
IF EXISTS(SELECT * FROM SYS.ASSEMBLIES WHERE NAME='SqlClr')
DROP ASSEMBLY SqlClr
GO
--5. 创建主程序集: SqlClr
CREATE ASSEMBLY SqlClr FROM 'D:\Tools\DBA\SqlClr\SqlClr.dll' WITH PERMISSION_SET = UNSAFE
GO
-- =============================================
-- Author: yenange
-- Create date: 2014-11-25
-- Description: 正则表达式匹配
-- =============================================
CREATE FUNCTION [dbo].[Fun_DBA_IsMatch]
(
@source AS NVARCHAR(MAX), --要匹配的文本
@pattern AS NVARCHAR(200), --进行匹配的正则表达式
@option INT=3 --正则表达式匹配选项,1为忽略大小写,2为多行匹配,3为忽略大小写且多行匹配
)
RETURNS BIT
AS
EXTERNAL NAME [SqlClr].[SqlClr.SqlCLR].[IsMatch];
GO
-- =============================================
-- Author: yenange
-- Create date: 2014-11-25
-- Description: 判断字符串是否为中文
-- =============================================
CREATE FUNCTION [dbo].[Fun_DBA_IsChinese]
(
@source AS NVARCHAR(MAX) --要匹配的文本
)
RETURNS BIT
AS
EXTERNAL NAME [SqlClr].[SqlClr.SqlCLR].[IsChinese];
GO
-- =============================================
-- Author: yenange
-- Create date: 2016-10-20
-- Description: 根据Url获取html
-- =============================================
CREATE FUNCTION [dbo].[Fun_DBA_GetHTML]
(
@url AS NVARCHAR(MAX) --url
)
RETURNS NVARCHAR(MAX)
AS
EXTERNAL NAME [SqlClr].[SqlClr.SqlCLR].[Fun_GetHTML];
GO
IF OBJECT_ID('Fun_SplitChineseAndEnglish') IS NOT NULL
DROP FUNCTION Fun_SplitChineseAndEnglish
GO
-- =============================================
-- Author: yenange
-- Create date: 2014-11-25
-- Description: 切分中英文
-- =============================================
CREATE FUNCTION [dbo].Fun_SplitChineseAndEnglish
(
@source AS NVARCHAR(MAX) --要匹配的文本
)
RETURNS @r TABLE(
rowNum INT IDENTITY(1,1) PRIMARY KEY
,string NVARCHAR(max)
,isChinese BIT
)
AS
BEGIN
DECLARE @single NCHAR(1),@rowNum INT
WHILE len(@source)>0
BEGIN
SET @single=substring(@source,1,1)
SELECT @rowNum=isnull(MAX(rowNum),0) FROM @r
IF dbo.Fun_DBA_IsChinese(@single)=1
BEGIN
IF EXISTS(SELECT * FROM @r WHERE rowNum=@rowNum AND isChinese=1)
UPDATE @r SET string=string+@single WHERE rowNum=@rowNum
ELSE
INSERT INTO @r (string,isChinese) VALUES(@single,1)
END
ELSE
BEGIN
IF EXISTS(SELECT * FROM @r WHERE rowNum=@rowNum AND isChinese=0)
UPDATE @r SET string=string+@single WHERE rowNum=@rowNum
ELSE
INSERT INTO @r (string,isChinese) VALUES(@single,0)
END
SET @source=SUBSTRING(@source,2,LEN(@source))
END
RETURN
END
GO
示例代码:
DECLARE @s NVARCHAR(MAX)
SET @s='被子植物门 Angiospermae双子叶植物纲 Dicotyledoneae原始花被亚纲 Archichlamydeae伞形目 Umbelliflorae五加科 Araliaceae多蕊木族 PLERANDREAE五加属 Acanthopanax五加组 Sect. Acanthopanax'
SELECT * FROM dbo.Fun_SplitChineseAndEnglish(@s)
结果: