Quantcast
Channel: artigos TechNet
Viewing all articles
Browse latest Browse all 8688

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

$
0
0
Revisão Atual postado em artigos TechNet por Durval Ramos em 26/8/2014 12:20:55

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 eSUBSTRING.

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"

CREATEFUNCTIONdbo.UFN_SEPARATES_COLUMNS(
 @TEXT varchar(8000)
,@COLUMN    tinyint
,@SEPARATORchar(1)
)RETURNSvarchar(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>SET@POS_START =LEN(@TEXT)+ 1
       IF@POS_END= 0SET@POS_END=LEN(@TEXT)+ 1 

       RETURNSUBSTRING (@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,'|')ASDATE),
  @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_PERSONAS CD_PERSON,@NM_MAILASNM_MAIL,FORMAT(@DT_CREATED,'MM/dd/yyyy') ASDT_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@ISBNvarchar(20)='978-0-571-08989-5'

SELECT
  dbo.UFN_SEPARATES_COLUMNS(@ISBN, 1,'-')ASPREFIX,
  dbo.UFN_SEPARATES_COLUMNS(@ISBN, 2,'-')ASREGISTRATION_GROUP,
  dbo.UFN_SEPARATES_COLUMNS(@ISBN, 3,'-')ASREGISTRANT,
  dbo.UFN_SEPARATES_COLUMNS(@ISBN, 4,'-')ASPUBLICATION,
  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


Tags: Durval

Viewing all articles
Browse latest Browse all 8688

Latest Images

Trending Articles



Latest Images

<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>