Simulando Array e Separação de elementos String no SQL Server 2008

Dica – Simulando Array e Separação de elementos String no SQL Server 2008.

Salve galera, boa tarde.

Hoje vou postar algo diferente em minhas dicas, mas tenho certeza que muita gente vai gostar.

__________________________________________________________________________________________

Você já ouvi falar de Estruturas de Dados?

• Na Ciência da computação, uma estrutura de dados é um modo particular de armazenamento e organização de dados em um computador. Seu objetivo é possibilitar a utilização deste mesmo dado, de forma eficiente.

• Diferentes tipos de estrutura de dados são adequadas a diferentes tipos de aplicação, algumas são altamente especializadas, destinando-se a tarefas específicas.

• Por exemplo, as B-trees(Árvores binárias) são particularmente indicadas para a implementação de bases de dados, devido a sua forma de ordenação e armazenamento dos dados, considerada de grande eficiência durante os processos de busca e pesquisa de informações.

• As Estruturas de dados são consideradas temas fundamentais na ciência da computação, sendo utilizadas nas mais diversas áreas do conhecimento e com os mais diferentes propósitos de aplicação.

• Quando estes dados estão organizados (dispostos) de forma coerente, caracterizam uma forma, denominada estrutura de dados.

• A organização e os métodos para manipular essa estrutura é que lhe conferem singularidade, específicos para cada estrutruda de dados, bem como, os tipos de dados armazenados nesta estrutura.

• As estruturas de dados são chamadas tipos de dados compostos que dividem-se em homogêneos (vetores e matrizes) e  heterogêneos (registros).
• As estruturas homogêneas são conjuntos de dados formados pelo mesmo tipo de dado primitivo. Ao contrário as estruturas heterogêneas são conjuntos de dados formados por tipos de dados primitivos diferentes (campos do registro) em uma mesma estrutura.
• A escolha de uma estrutura de dados apropriada pode se tornar um problema complicado em uma solução relativamente simples, caso seja definida uma estrutura inadequada ou incompatível.
Matrizes e Vetores (Arrays)
• Em programação de computadores, um array, também é conhecido como vetor (para arrays uni-dimensionais) ou matriz (para arrays bi-dimensionais), considerado uma das mais simples estruturas de dados. Os arrays mantêm uma série de elementos de dados, geralmente do mesmo tamanho e tipo de dados.
• Estes elementos individuais são acessados por sua posição no array. A posição é dada por um índice, também chamado de subscrição.
• O índice geralmente utiliza uma seqüência de números inteiros, (ao contrário de um array associativo) mas o índice pode ter qualquer valor ordinal. Alguns arrays podem ser definidos como multi-dimensionais, significando que eles são indexados por
um número fixo de números inteiros. A matriz pode ser definida como uma coleção de variáveis de mesmo tipo, acessíveis com um único nome e armazenados contiguamente na memória.
• Por exemplo, uma sequência (ou sucessão) finita de quatro números inteiros, geralmente, arrays uni- e bi-dimensionais são os mais comuns.
• Consideradas como estruturas de dados simples, vetores e matrizes possuem a vantagem de que os seus elementos são acessíveis de forma rápida, mas apresentam uma notável limitação: São definidos por um tamanho fixo.
• Esta suposta limitação pode ser contornada, através do uso de algoritmos, que possibilitam a declaração de um vetor com tamanho indefinido, mais conhecido como Vetor ou Array Dinâmico.
• A ordem de armazenamento aos dados, ocorre com base na ordenação das posições definição em cada índice, sendo este índice numerado de forma sequencial. O conjunto de valores armazenados em um vetor ou matriz, podem estar organizados de forma: aleatórias, sequencial ou mista(contendo partes  organizadas sequencialmente misturada com partes aleatórias).
• A forma de acesso aos elementos de um vetor ou matriz é direta, ao contrário das listas. Isto quer dizer que o elemento desejado obtêm-se a partir do seu índice e não é preciso procurá-lo elemento por elemento.
Após esta introdução sobre Estrutura de Dados, Matrizes, Vetores e Arrys, podemos dizer que temos um conhecimento prévio para se entender a forma de organização e utilização de Arrays.
Muito bem, mas em Bancos de Dados Relacionais, ou melhor dizendo no SQL Server como podemos simular e até mesmo colocar em prática este tipo de estrutura de dados?
É justamente a resposta para este pergunta que pretendo demonstrar para vocês!!! Bom vamos então construir nosso ambiente de trabalho, para isso duas novas tabelas serão criadas, sendo elas:
  • dbo.Numeracao –> Tabela auxiliar responsável em armazenar uma sequência de números inteiros;
  • dbo.Arrays –> Tabela principal, utilizada para armazenar os elementos que compõem no Array.

A Listagem 1 apresentada a abaixo, ilustra o código de criação e população de dados para as tabelas dbo.Numeracao e dbo.Arrays,

— Listagem 1 – Criando as tabelas dbo.Numeracao e dbo.Arrays —

Use TEMPDB;

Go

If OBJECT_ID(‘dbo.Numeracao’,’U’) Is Not Null

Drop Table dbo.Numeracao;

— Criação da tabela dbo.Numeracao — 

Create Table dbo.Numeracao

(Numero Int Not Null Primary Key) ;

Go

Declare @ValorMaximo Int,

@Contador Int;

Set @ValorMaximo=1000000;

Set @Contador=1;

Insert Into dbo.Numeracao Values(1)

— Loop de inserção de dados —

While @Contador * 2 <= @ValorMaximo

 Begin

   Insert Into dbo.Numeracao

   Select Numero+@Contador from dbo.Numeracao;

   Set @Contador *= 2;       

 End

— Inserção de dados complementares da tabela dbo.Numeracao —

Insert Into dbo.Numeracao

 Select Numero + @Contador from dbo.Numeracao

 Where Numero + @Contador <= @ValorMaximo

Go

IF OBJECT_ID(‘dbo.Arrays’) Is Not Null

Drop Table dbo.Arrays;

— Criando a tabela dbo.Arrays —

Create Table dbo.Arrays

(Idx Varchar(10) Not Null Primary Key,

Elementos Varchar(8000) Not Null)

Go

— Inserção de dados na tabela dbo.Arrays —

Insert Into Arrays(Idx, Elementos)

Values

 (‘A’,‘20,223,2544,25567,14’),

(‘B’,’30,-23433,28′),

(‘C’,‘12,10,8099,12,1200,13,12,14,10,9’),

(‘D’,‘-4,-6,-45678,-2’)
GO

Nossas tabelas foram criadas e seus respectivos dados armazenados em suas estruturas, vale ressaltar que a tabela dbo.Numeracao possui uma massa de 1 milhão de linhas de registros. Para confirmar podemos observar a Figura 1, apresentada a seguir:

Figura 1 – Dados armazenados nas tabelas dbo.Numeracao e dbo.Arrays.

Agora com nosso ambiente pronto e abastecido de informações, o próximo passo é montar o Array, tarefa que será dividida em algumas fases.

A Listagem 2, apresenta a Primeira Fase para construção do nosso Array, onde inicialmente vamos realizar um Select fazendo a junção entre a tabela dbo.Numeracao e dbo.Array. O objetivo deste select é obter o Número armazenado na tabela dbo.Numeracao correspondente ao tamanho dos elementos envolvidos em cada linha da tabela dbo.Arrays.

Neste código utilizo a função DataLength(): Retorna o número de bytes usado para representar qualquer expressão, outro detalhe importante esta relacionado com a função SubString(): Retorna parte de uma expressão de caractere, binária, de texto ou de imagem, através desta função, vamos retornar a vírgula utilizada como separador de caracteres armazenados na coluna Elementos existente na tabela Arrays.

— Listagem 2 – Primeira fase para construção do Array —

Select A.Idx, A.Elementos,

N.Numero

from dbo.Arrays A Join dbo.Numeracao N

On N.Numero <= DATALENGTH(A.Elementos)

                                 And SUBSTRING(Elementos, Numero, 1) = ‘,’ 

Após executarmos a Listagem 2, temos o seguinte resultado, conforme apresenta a Figura 2:

Figura 2 — Resultado da execução da Listagem 2.

Vamos para o próximo passo, evoluir nossa estrutura o mais próximo de um Array, neste caso, transformar nosso elementos que estão agrupados em uma única linha correspondente ao linha registro em linhas separadas, para isso, vou utilizar neste segunda fase da função CharIndex: Utilizada para pesquisar valores em declarados em uma expressão que possam existir na expressão de origem, retornando a posição desta expressão.

Pois bem, vamos utilizar então a CharIndex para pesquisar dentro da coluna Elementos, a vírgula utilizada como separador de caracteres, com isso, teremos a posição de cada vírgula existente entre os valores declarados. Esta linha de código será o ponto chave para a montar do nosso Array, conforme a Listagem 3 apresentada a seguir, bem como, a Figura 4 que ilustra nosso Array.

Select

A.Idx,

Substring(A.Elementos, N.Numero,

CHARINDEX(‘,’, A.Elementos + ‘,’, N.Numero)-N.Numero) As Elementos

from

dbo.Arrays A Join dbo.Numeracao N

On N.Numero <= DATALENGTH(A.Elementos) + 1

And SUBSTRING(‘,’ + A.Elementos, Numero, 1) = ‘,’

— Listagem 3 – Segunda fase para construção do Array —

Select A.Idx,

Substring(A.Elementos, N.Numero, CHARINDEX(‘,’, A.Elementos + ‘,’, N.Numero)-N.Numero) As Elementos

from dbo.Arrays A Join dbo.Numeracao N

                                  On N.Numero <= DATALENGTH(A.Elementos) + 1

                                  And SUBSTRING(‘,’ + A.Elementos, Numero, 1) = ‘,’

Figura 3 – Elementos separados através da utilização da função SubString em conjunto com a função CharIndex.

Então os elementos foram separados, nosso Array esta quase pronto, o que falta agora é estabelecer a posição de cada elemento, o que representa a fase final da construção do nosso Array, conforme apresenta a Listagem 4 e demonstrado na Figura 4.

— Listagem 4 — Fase Final – Construção do Array —

Create Table dbo.ArrayCompleto

(Idx Int Identity Primary Key,

Identificador Char(1) Not Null,

Elementos Varchar(10))

Go

— Inserindo os dados na Tabela ArrayCompleto —  

Insert Into ArrayCompleto(Identificador, Elementos)

Select A.Idx,

Substring(A.Elementos, N.Numero, CHARINDEX(‘,’, A.Elementos + ‘,’, N.Numero)-N.Numero) As Elementos

from dbo.Arrays A Join dbo.Numeracao N

On N.Numero <= DATALENGTH(A.Elementos) + 1

And SUBSTRING(‘,’ + A.Elementos, Numero, 1) = ‘,’

Go;

Figura 4 – Estrutura Completa do Array.

Com base no resultado apresentado na Figura 4, temos a comprovação que nosso Array esta pronto, nossa estrutura criada anteriormente contendo os elementos agrupados por Identficadores foram distribuídos em cada linha, nossa sua estrutura de Array esta completa, contendo a coluna Índice, a coluna Identificador que representava um campo de identifação dos Elementos e a coluna Elementos com cada valor disposto em linhas distintas.

Sendo assim, acredito que esta dica se encerra aqui, nosso Array esta montando e pronto para ser utilizado!!!

Espero que você tenha gostado e entendido como podemos construir um simples Array no SQL Server, fazendo uso de funções Strings, separadores de caracteres e decomposição de elementos.

Agradeço a sua visita, nos encontramos nos próximos artigos.

Até mais.

Autor: Junior Galvão - MVP

Profissional com vasta experiência na área de Tecnologia da Informação e soluções Microsoft. Pós-Graduado no Curso de Gestão e Engenharia de Processos para Desenvolvimento de Software com RUP na Faculdade FIAP – Faculdade de Informática e Administração Paulista de São Paulo. Graduado no Curso Superior em Gestão da Tecnologia de Sistemas de Informação pela Uninove – Campus São Roque. Formação MCDBA Microsoft, autor de artigos acadêmicos e profissionais postados em Revistas, Instituições de Ensino e WebSistes. Meu primeiro contato com tecnologia ocorreu em 1994 após meus pais comprarem nosso primeiro computador, ano em que as portas para este fantástico mundo se abriram. Neste mesmo ano, comecei o de Processamento de Dados, naquele momento a palavra TI não existia, na verdade a Tecnologia da Informação era conhecida como Computação ou Informática, foi assim que tudo começou e desde então não parei mais, continuando nesta longa estrada até hoje. Desde 2001 tenho atuado como Database Administrator – Administrador de Banco de Dados – SQL Server em tarefas de Administração, Gerenciamento, Migração de Servidores e Bancos de Dados, Estratégias de Backup/Restauração, Replicação, LogShipping, Implantação de ERPs que utilizam bancos SQL Server, Desenvolvimento de Funções, Stored Procedure, entre outros recursos. Desde 2008 exerço a função de Professor Universitário, para as disciplinas de Banco de Dados, Administração, Modelagem de Banco de Dados, Programação em Banco de Dados, Sistemas Operacionais, Análise e Projetos de Sistemas, entre outras. Experiência na Coordenação de Projetos de Alta Disponibilidade de Dados, utilizando Database Mirroring, Replicação Transacional e Merge, Log Shipping, etc. Trabalhei entre 2011 e 2017 como Administrador de Banco de Dados e Coordenador de TI no FIT – Instituto de Tecnologia da Flextronics, atualmente exerço a função de Professor Universitário na FATEC São Roque. CTO da Galvão Tecnologia, consultoria especializada em Gestão de TI, Administração de Servidores Windows Server, Bancos de Dados Microsoft SQL Server e Virtualização. Possuo titulação Oficial Microsoft MVP e reconhecimentos: MCC, MSTC e MIE.

3 comentários em “Simulando Array e Separação de elementos String no SQL Server 2008”

Os comentários estão encerrados.