Compartilhar via


T-SQL: Dividindo uma String em múltiplas colunas

Introdução

Possuir uma alternativa simples, utilizando T-SQL, para separar e formatar os dados que recebemos de uma aplicação ou serviço de fonte de dados externa como um Web Service ou um arquivo com dados (.TXT ou .CVS) delimitados por um carácter separador é muito útil.

Este artigo apresenta uma função escalar definida pelo usuário para tratar os dados adequadamente para posterior armazenamento em uma ou mais tabelas de seu banco de dados.

É possível também separar e isolar às informações de uma mesma coluna de formato texto (char, nchar, varchar ou nvarchar) armazenadas em seu banco de dados para diversas tarefas de identificação de informações, como por exemplo na identificação de uma edição de um livro ou outro tipo de publicação.

Criando a Function

Para a criação desta função, utilizamos a posição do carácter separador em relação à sua string, através dos métodos CHARINDEX e SUBSTRING.

Isto também auxilia na identificação do valor contido na coluna que é informada pelo usuário.

Veja a imagem abaixo

Veja abaixo o script T-SQL desta "User Function"


CREATE FUNCTION dbo.UFN_SEPARATES_COLUMNS(
 @TEXT  varchar(8000)
,@COLUMN     tinyint
,@SEPARATOR char(1)
)RETURNS varchar(8000)
AS
  BEGIN
       DECLARE @POS_START  int = 1
       DECLARE @POS_END    int = CHARINDEX(@SEPARATOR, @TEXT, @POS_START)

       WHILE (@COLUMN >1 AND @POS_END\> 0)
         BEGIN
             SET @POS_START = @POS_END + 1
             SET @POS_END = CHARINDEX(@SEPARATOR, @TEXT, @POS_START)
             SET @COLUMN = @COLUMN - 1
         END 

       IF @COLUMN > 1  SET @POS_START = LEN(@TEXT) + 1
       IF @POS_END = 0 SET @POS_END = LEN(@TEXT) + 1 

       RETURN SUBSTRING (@TEXT, @POS_START, @POS_END - @POS_START)
  END
GO


Para verificar se os dados estão sendo obtidos corretamente na importação de dados, verificamos os dados e separamos conforme a necessidade da estrutura de nossa tabela.

Não é necessário coletar, separar e formatar todas às informações que recebemos sempre, deste modo, tornamos todo processo de obtenção dos dados rápido e limpo, obtendo apenas o que realmente importa ser armazenado.

Vamos apresentar abaixo dois exemplos de uso desta função:

  • Usando os dados importados de um arquivo e;
  • Usando a informação de uma variável ou coluna de uma tabela

 

Importando Dados

Neste exemplo podemos identificar os dados de um registro separados por um determinado carácter, porém precisamos obter apenas os valores referentes aos campos como indicado na tabela abaixo:

 Posição   Nome da Coluna   Descrição 
 #1  CD_PERSON  Código da Pessoa
 #2  NM_MAIL   Endereço de e-mail no Trabalho
 #3  DT_CREATED  Data de Criação do Registro

Veja abaixo um exemplo de uma linha com diversos dados separados pelo carácter "|".

Veja a imagem abaixo

**Veja abaixo um exemplo desta função separando uma linha importada em colunas **


DECLARE @IMPORTROW         varchar(500)

DECLARE @CD_PERSON         int
DECLARE @NM_MAIL           varchar(25)
DECLARE @DT_CREATED        date 

SET @IMPORTROW = '154198|2014-01-08|durval@test.com|Comments|123456|2015-10-30|'

SELECT
  @CD_PERSON = dbo.UFN_SEPARATES_COLUMNS(@IMPORTROW, 1, '|'),
  @DT_CREATED = CAST(dbo.UFN_SEPARATES_COLUMNS(@IMPORTROW, 2, '|') AS DATE),
  @NM_MAIL = dbo.UFN_SEPARATES_COLUMNS(@IMPORTROW, 3, '|');

--COM ESTAS VARIÁVEIS, VOCÊ PODE CONSTRUIR UMA
--PROCEDURE PARA ATUALIZAR OS DADOS NA TABELA
SELECT @CD_PERSON AS CD_PERSON, @NM_MAIL AS NM_MAIL, FORMAT(@DT_CREATED, 'MM/dd/yyyy') AS DT_CREATED;
GO


Dividindo uma Estrutura de Dados

Outra maneira de utilizar esta função é obtendo os elementos de uma estrutura conhecida à partir de uma variável ou da coluna de uma tabela.

Para facilitar sua compreensão, vamos utilizar um código ISBN (International Standard Book Number) e separar seus elementos de acordo com sua a documentação.

Veja abaixo este exemplo separando os elementos de um ISBN pelo carácter "-".

Veja a imagem abaixo

Veja abaixo um exemplo desta função separando os elementos de um código ISBN


--OBTÉM OS ELEMENTOS DE UMA ESTRUTURA "ISBN"
DECLARE @ISBN varchar(20) = '978-0-571-08989-5'

SELECT
  dbo.UFN_SEPARATES_COLUMNS(@ISBN, 1, '-') AS PREFIX,
  dbo.UFN_SEPARATES_COLUMNS(@ISBN, 2, '-') AS REGISTRATION_GROUP,
  dbo.UFN_SEPARATES_COLUMNS(@ISBN, 3, '-') AS REGISTRANT,
  dbo.UFN_SEPARATES_COLUMNS(@ISBN, 4, '-') AS PUBLICATION,
  dbo.UFN_SEPARATES_COLUMNS(@ISBN, 5, '-') AS [CHECK]
GO


Conclusão

É importante identificar e formatar os dados que recebemos para melhorar às condições de armazenamento e exibição de dados.

Por mais genérico que seja o formato de um código, composto por letras e números, é possível desmembrar seu conteúdo para que possamos obter informações mais precisas sobre um registro de nosso banco de dados.

Referências

Veja Também

Outros Idiomas