sqlserver自定义 split
时间: 2025-05-29 07:09:51 浏览: 12
### 创建和使用 SQL Server 自定义 Split 函数
在 SQL Server 中,可以通过创建用户定义的表值函数来实现字符串分割功能。这种类型的函数可以返回一个表格形式的结果集,其中每一行代表原始字符串中的一个子串。
#### 使用 CLR 集成的方式创建 Split 函数
对于更高效的解决方案,可以选择通过 .NET Framework 的 Common Language Runtime (CLR) 来集成并编写 C# 或 VB.NET 代码作为扩展方法[^1]:
```csharp
using System;
using System.Collections.Generic;
using Microsoft.SqlServer.Server;
using System.Data.SqlTypes;
public class UserDefinedFunctions {
[SqlFunction(FillRowMethodName="FillSplitRow")]
public static IEnumerable SplitString(string str, char separator){
List<string> result = new List<string>();
if (!string.IsNullOrEmpty(str)){
string[] parts = str.Split(separator);
foreach(var part in parts){
result.Add(part.Trim());
}
}
return result;
}
public static void FillSplitRow(object obj, out SqlString value){
value = new SqlString((string)obj);
}
}
```
此代码片段展示了如何利用 CLR 编写自定义 `Split` 函数,并将其注册到 SQL Server 数据库中以便调用。
#### 不依赖于 CLR 的 T-SQL 版本 Split 函数
如果不想启用 CLR 支持,则可以直接采用纯 T-SQL 方式构建类似的逻辑:
```sql
CREATE FUNCTION dbo.fn_Split(
@Input NVARCHAR(MAX),
@Delimiter CHAR(1)
)
RETURNS TABLE AS RETURN (
WITH Nums(n)AS(SELECT ROW_NUMBER()OVER(ORDER BY t1.number)-1 FROM master..spt_values t1 CROSS JOIN master..spt_values t2 WHERE t1.type='P' AND t2.type='P'),
ParsedStrings(value, rn) AS (
SELECT CAST(SUBSTRING(@Input,n+1,
CASE WHEN PATINDEX('%'+@Delimiter+'%',SUBSTRING(@Input+n,@Delimiter))=0 THEN LEN(@Input)-n ELSE PATINDEX('%'+@Delimiter+'%',SUBSTRING(@Input,n+1,LEN(@Input))) END ) as nvarchar(max)),
ROW_NUMBER() OVER (ORDER BY n)
FROM Nums WHERE SUBSTRING(@Input,n,1)=@Delimiter OR n=0 )
SELECT value FROM ParsedStrings ORDER BY rn );
GO
```
上述脚本提供了一个基于递归公用表表达式的替代方案,在不借助外部编程语言的情况下实现了相同的功能[^2]。
阅读全文
相关推荐

















