novembre
2011
La fonction Split de découpage d’une chaîne de caractère en fonction d’un séparateur n’existe pas encore nativement sous T-SQL. Le besoin et la place de cette fonction dans un SGBD n’est plus à démontrer. En espérant que cette fonction soit présente dans la version suivante de SQL SERVER 2012, voici une fonction CLR codée en C# .NET
=> Code C# .NET Framework 2.0
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Collections;
public partial class CLR_Split
{
[Microsoft.SqlServer.Server.SqlFunction (TableDefinition = "id NVARCHAR(max),str NVARCHAR(max)",FillRowMethodName = "GetRow")]
public static IEnumerable F_CLR_Split(string str, char separator, char WithNull)
{
ArrayList rowsArray = new ArrayList();
F_Split(str,separator,WithNull,rowsArray);
return rowsArray;
}
public static void F_Split(string str, char separator, char WithNull, ArrayList rowsArray)
{
try
{
char[] charSeparator = new char[] { separator };
String[] result;
// retourne toutes les chaines splitées y compris les lmentts vides
if (WithNull == '1')
{
result = str.Split(charSeparator, StringSplitOptions.None);
int i = result.Length;
for (i = 0; i < result.Length; i++)
{
object[] column = new object[2];
column[0] = i + 1;
column[1] = result[i].ToString();
rowsArray.Add(column);
}
}
// retourne toutes les chaines splitées non vides
else
{
result = str.Split(charSeparator, StringSplitOptions.RemoveEmptyEntries);
int i = result.Length;
for (i = 0; i < result.Length; i++)
{
object[] column = new object[2];
column[0] = i + 1;
column[1] = result[i].ToString();
rowsArray.Add(column);
}
}
}
catch (Exception e)
{
e.Source.ToString();
e.Message.ToString();
}
}
private static void GetRow(Object obj, out SqlString id, out SqlString str)
{
object[] row = (object[])obj;
id = row[0].ToString();
str = row[1].ToString();
}
};
=> Test 1
SELECT * FROM dbo.F_CLR_Split('a:b:c:d:e:::',':',0)
------
1 a
2 b
3 c
4 d
5 e
=> Test 2
SELECT * FROM dbo.F_CLR_Split('a:b:c:d:e:::',':',1)
------
1 a
2 b
3 c
4 d
5 e
6
7
8
Happy Query
—————————
Etienne ZINZINDOHOUE
—————————