Hola, chicos,
¿Estás bien?
En esta publicación de hoy, compartiré con ustedes una función UDF con valores de tabla que le permite dividir cadenas en líneas, forzando que la longitud máxima de cada línea sea N caracteres separados por un carácter separador definido en la llamada a la función.
Esta función surgió de una necesidad en un proyecto crítico donde trabajo, en el que tenemos cadenas VARCHAR(MAX) y necesitamos exportar estas cadenas a un archivo TXT con un tamaño máximo de 60 caracteres, manteniendo un Id para identificar el registro original y un ranking (yo usé ROW_NUMBER) para identificar el orden de cada parte de la cadena.
¿Interesado en aprender más sobre las divisiones?
- Dividir cadenas en subcadenas usando una cadena dividida
- charindexada: Una función diferente para romper cadenas delimitadas (dividir)
- Cómo dividir una cadena en una tabla de subcadenas usando un delimitador en SQL Server
Ejemplos de uso
Ejemplo con APLICACIÓN CRUZADA:
-- Utilizando o caractere espaço (' ') como separador e tamanho máximo da string
-- limitado a 10 caracteres
IF (OBJECT_ID('tempdb..#Teste') IS NOT NULL) DROP TABLE #Teste
CREATE TABLE #Teste (
Id_Texto INT IDENTITY(1, 1),
Ds_Texto VARCHAR(MAX)
)
INSERT INTO #Teste
VALUES('Dirceu Resende - Testando a função do CLR numa table valued function'),
('No caso de uma palavra ficar maior que a quantidade de caracteres estipulada, a string não será "quebrada". Exemplo: https://dirceuresende.com'),
('Para saber mais sobre CLR, acesse o meu blog')
SELECT
*
FROM
#Teste A
CROSS APPLY CLR.dbo.fncSplit_Texto(A.Ds_Texto, ' ', 10) B
Código fuente de la función
Para utilizar la función demostrada anteriormente, simplemente cree la función CLR con valores de tabla en su instancia. Para comprender mejor qué es CLR y cómo crear su primera biblioteca CLR, vea más en la publicación Introducción a SQL CLR (Common Language Runtime) en SQL Server.
using System;
using System.Collections;
using System.Data.SqlTypes;
public partial class UserDefinedFunctions
{
private class SplitTexto
{
public SqlInt32 Id;
public SqlString Ds_Palavra;
public SplitTexto(SqlInt32 id, SqlString dsPalavra)
{
Id = id;
Ds_Palavra = dsPalavra.IsNull ? "" : dsPalavra;
}
}
[Microsoft.SqlServer.Server.SqlFunction(
FillRowMethodName = "FillSplitTexto",
TableDefinition = "Id INT, Ds_Palavra NVARCHAR(4000)"
)]
public static IEnumerable fncSplit_Texto(string Ds_Texto, string Ds_Separador, int Tamanho_Palavra)
{
var splitTextoCollection = new ArrayList();
if (string.IsNullOrEmpty(Ds_Texto))
return splitTextoCollection;
var contador = 1;
var palavra = "";
Ds_Texto = Ds_Texto + Ds_Separador;
while (Ds_Texto.Length > 0)
{
var substring = Ds_Texto.Substring(0, Ds_Texto.IndexOf(Ds_Separador, StringComparison.Ordinal)).Trim();
if (palavra == " ")
palavra = "";
if ((palavra + " " + substring).Length > Tamanho_Palavra)
{
splitTextoCollection.Add(new SplitTexto(
contador,
palavra.Trim()
));
palavra = substring;
contador++;
}
else
{
palavra = palavra == " " ? substring : (palavra + " " + substring);
}
Ds_Texto = Ds_Texto.Substring(Ds_Texto.IndexOf(Ds_Separador, StringComparison.Ordinal) + 1);
}
if (palavra.Trim().Length > 0)
{
splitTextoCollection.Add(new SplitTexto(
contador,
palavra.Trim()
));
}
return splitTextoCollection;
}
protected static void FillSplitTexto(object objSplitTexto, out SqlInt32 id, out SqlString dsPalavra)
{
var splitTexto = (SplitTexto) objSplitTexto;
id = splitTexto.Id;
dsPalavra = splitTexto.Ds_Palavra.IsNull ? "" : splitTexto.Ds_Palavra;
}
};
¡Eso es todo, amigos!
Un abrazo y hasta la próxima.


Comentários (0)
Carregando comentários…