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