sql >> Base de Datos >  >> Database Tools >> SSMS

Dividir un valor de campo único en múltiples valores de columna de longitud fija en T-SQL

Como eres .net desarrollador Supongo que será fácil para ti escribir un .net función que puede usar en su T-SQL código. Para escribir SQL CLR funciones comprobar esta respuesta (He usado uno de los enlaces para implementar SQL CLR función de expresión regular.

Digamos que necesita dividir los valores en fragmentos de 4 longitudes y mostrar un máximo de 6 de ellos:

DECLARE @DataSouce TABLE
(
    [RecordID] TINYINT IDENTITY(1,1) PRIMARY KEY
   ,[RecordData] NVARCHAR(MAX)
);

INSERT INTO @DataSouce ([RecordData])
VALUES ('test some test goes here')
      ,('some numbers go here - 1111122222233333344444444445');


SELECT DS.[RecordID]
      ,RM.[MatchID]
      ,RM.[CaptureValue]
FROM @DataSouce DS
CROSS APPLY [dbo].[fn_Utils_RegexMatches] ([RecordData], '.{1,4}') RM;

Ahora los datos están divididos. Vamos a pivot y muestra solo 6 de los fragmentos:

SELECT *
FROM
(
    SELECT DS.[RecordID]
          ,RM.[MatchID]
          ,RM.[CaptureValue]
    FROM @DataSouce DS
    CROSS APPLY [dbo].[fn_Utils_RegexMatches] ([RecordData], '.{1,4}') RM
) DS
PIVOT
(
    MAX([CaptureValue]) FOR [MatchID] IN ([0], [1], [2], [3], [4], [5], [6])
) PVT;

Aquí uso regex función para dividir los datos y PIVOT para crear columnas y excluir algunos de los fragmentos. Ahora puede insertar los datos en la tabla para materializarlos y luego exportarlos. Puede implementar dicha función usando el enlace de arriba o crear su propia función haciendo algo que necesite.