SSMS
 sql >> Database >  >> Database Tools >> SSMS

Dividi un valore di campo singolo in più valori di colonna a lunghezza fissa in T-SQL

Poiché sei .net sviluppatore Immagino che per te sarà facile scrivere un .net funzione che puoi usare nel tuo T-SQL codice. Per scrivere SQL CLR funzioni controlla questa risposta (Ho usato uno dei link per implementare SQL CLR funzione regolare.

Diciamo che devi dividere i valori per blocchi di 4 lunghezze e mostrarne al massimo 6:

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;

Ora i dati sono divisi. Facciamo pivot it e mostra solo 6 dei blocchi:

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;

Qui uso regex funzione per dividere i dati e PIVOT per creare colonne ed escludere alcuni blocchi. Ora puoi inserire i dati nella tabella per materializzarli e quindi esportarli. Puoi implementare tale funzione utilizzando il link sopra o creare la tua funzione facendo qualcosa di cui hai bisogno.