博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【51CTO/BBS】请教: SQL里有没有字符串分解Split的函数??
阅读量:6557 次
发布时间:2019-06-24

本文共 3978 字,大约阅读时间需要 13 分钟。

原帖地址:

 

问题描述:

VB 中有两个非常好用的字符串处理函数:

Split(字符串,分隔符)作用:将【字符串】以【分隔符】作为边界,分解成数组。 返回:一个字符串数组。

Join(字符数组,分隔符)作用:将【字符数组】中的元素,以【分隔符】作为边界,连接成一个字符串。返回:一个字符串。

请教老师们,SQL里是否有类似的函数?

 

解决方案:

如何用SQL Server Function实现Split

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
--Split 表函数将一个字符串按指定分隔符进行分割,返回一个表。
create 
function 
split(
@string 
varchar
(255),
--待分割字符串
@separator 
varchar
(255)
--分割符
)
returns 
@array 
table
(item 
varchar
(255))
as
begin
declare 
@
begin 
int
,@
end 
int
,@item 
varchar
(255)
set 
@
begin 
= 1
set 
@
end
=charindex(@separator,@string,@
begin
)
while(@
end
<>0)
begin
set 
@item = 
substring
(@string,@
begin
,@
end
-@
begin
)
insert 
into 
@array(item) 
values
(@item)
set 
@
begin 
= @
end
+1
set 
@
end
=charindex(@separator,@string,@
begin
)
end
set 
@item = 
substring
(@string,@
begin
,len(@string)+1-@
begin
)
if (len(@item)>0)
insert 
into 
@array(item) 
values
(
substring
(@string,@
begin
,len(@string)+1-@
begin
))
return
end

 

如何用SQL CLR实现Split

步骤一:

 

开始,运行Visual Studio 2012,选择“New Project”,选择“Visual C#”,“类库”,命名类库为fnSplit。

 

 

步骤二:

 

默认,Visual studio创建一个空的类命名为“Class1.cs”,右键重命名为CLRFunction.cs。

 

 

步骤三:

 

双击“CLRFunction.cs”文件,输入如下代码:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
using 
System;
using 
System.Collections;
using 
System.Text;
using 
Microsoft.SqlServer.Server;
using 
System.Data.SqlTypes;
namespace 
fnSplit
{
public 
static 
class 
CLRFunctions
{
//SQL Functions require an additional "SqlFunction" Attribute.
//This attribute provides SQL server with additional meta data information it needs
//regarding our custom function. In this example we are not accessing any data, and our
//function is deterministic. So we let SQL know those facts about our function with
//the DataAccess and IsDeterministic parameters of our attribute.
//Additionally, SQL needs to know the name of a function it can defer to when it needs
//to convert the object we have returned from our function into a structure that SQL
//can understand. This is provided by the "FillRowMethodName" shown below.
[SqlFunction(
DataAccess = DataAccessKind.None,
FillRowMethodName = 
"MyFillRowMethod"
,IsDeterministic=
true
)
]
//SQL Functions must be declared as Static. Table Valued functions must also
//return a class that implements the IEnumerable interface. Most built in
//.NET collections and arrays already implement this interface.
public 
static 
IEnumerable Split(
string 
stringToSplit, 
string 
delimiters)
{
//One line of C# code splits our string on one or more delimiters...
//A string array is one of many objects that are returnable from
//a SQL CLR function - as it implements the required IEnumerable interface.
string
[] elements = stringToSplit.Split(delimiters.ToCharArray());
return 
elements;
}
//SQL needs to defer to user code to translate the an IEnumerable item into something
//SQL Server can understand. In this case we convert our string to a SqlChar object...
public 
static 
void 
MyFillRowMethod(Object theItem, 
out 
SqlChars results)
{
results = 
new 
SqlChars(theItem.ToString());
}
}
}

 

步骤四:

 

从BUILD菜单,选择“Build fnSplit”。编译后,在bin目录生成“fnSplit.dll”文件。拷贝该文件到SQL Server可访问目录,如D:\MSSQL\DATA\CLRLibraries。

 

 

 

步骤五:

 

打开SQL Server Management Studio,连接到需要部署该DLL的实例。

 

 

步骤六:

 

CLR集成默认在SQL Server是禁用的。执行下面的命令启用CRL集成。

 

1
2
3
4
5
6
7
8
9
sp_configure 
'show advanced options'
, 1
RECONFIGURE
GO
sp_configure 
'clr enabled'
, 1
RECONFIGURE
GO
sp_configure 
'show advanced options'
, 0
RECONFIGURE
GO

 

步骤七:

 

在应用的数据库中通过该DLL创建Assemblies。

 

1
2
Create 
Assembly fnSplit 
from 
'D:\MSSQL\DATA\CLRLibraries\fnSplit.dll' 
with 
Permission_set = SAFE
GO

 

 

步骤八:

 

创建Split函数,语法类似创建标准函数,除了使用“External”定位实际的程序逻辑到你的DLL中。

 

1
2
3
4
5
6
7
Create 
Function 
fnSplit(@StringToSplit nvarchar(
max
), @splitOnChars nvarchar(
max
) )
returns 
Table 
(
Results nvarchar(
max
)
)
AS
External 
name 
fnSplit.[fnSplit.CLRFunctions].Split;
GO

 

 

步骤九:

 

测试Split函数

 

1
SELECT 
FROM 
dbo.fnSplit(
'1,2,3,4,5:6:7~8~9'
,
',:~'
)

 

本文转自UltraSQL51CTO博客,原文链接:http://blog.51cto.com/ultrasql/1593531 ,如需转载请自行联系原作者

你可能感兴趣的文章
《软件性能测试与LoadRunner实战教程》喜马拉雅有声图书上线
查看>>
R语言可视化学习笔记之ggpubr包—SCI文章图
查看>>
【linux+C】通过几个实例温习指针
查看>>
HDU 1015 Safecracker 解决问题的方法
查看>>
【Echarts每天一例】-1
查看>>
ios 字典转模型
查看>>
正在编译转换: 未能找到元数据文件 EntityFramework.dll
查看>>
Java类集
查看>>
K-Means聚类算法的原理及实现【转】
查看>>
类的生命周期
查看>>
php apache用户写文件夹权限设置
查看>>
003-诠释 Java 工程师【一】
查看>>
浅析rune数据类型
查看>>
普通用户开启AUTOTRACE 功能
查看>>
1034 - Navigation
查看>>
Bind+Nginx实现负载均衡
查看>>
游侠原创:推荐一款免费的Syslog转发工具
查看>>
巧用Zabbix自定义监控Mysql性能状态
查看>>
UIKeyboard键盘相关知识点-IOS开发
查看>>
你真的会 snapshot 吗? - 每天5分钟玩转 OpenStack(163)
查看>>