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 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 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
- Accessing an Web Service from a SQL Server CLR Assembly (Procedure or Function)
- T-SQL: RIGHT, LEFT, SUBSTRING and CHARINDEX Functions
- Transact-SQL Portal