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.

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

Os comentários estão fechados.