WordPress.com



Como utilizar diversos tipos de dados em uma única coluna no SQL ServerPessoal, tudo bem?Recentemente foi questionado por alguns alunos, em rela??o a capacidade do SQL Server em reconhecer cada tipo de dados existente, como também, se existe a possibilidade de armazenar em uma mesma coluna diferentes tipos de informa??es.No momento desta pergunta, me veio a cabe?a, um simples exemplo: “Utilize um campo do tipo Varchar() ou Char(), desta forma, você poderá armazenar tanto valores numéricos como também valores caracteres”. Até ai tudo bem. Mas a dúvida persistiu e outro aluno me questionou.Galv?o, imagine a seguinte situa??o. “Uma coluna por exemplo denominada Valores_Diversos, e nesta mesma coluna o SQL Server permitir que sejam armazenados, dados do tipo, Integer, Varchar, Char, Float entre outros. Existe essa possibilidade?”. Pensei, pensei, pensei e devolvi a resposta: “Olha acredito que exista pois o SQL Server possui um mecanismo de armazenamento de dados em colunas muito versátil e volátil, mas eu n?o me lembro o nome deste recurso ou tipo de dados. Vou procurar e volto com a resposta.” Pois bem, seguindo alguns conselhos, informa??es, críticas e principalmente querendo postar algum de conteúdo didático e que possa ajudar, comecei durante estes dias estudar um pouco mais sobre as estruturas de armazenamento utilizadas pelo SQL Server.Dentre as estruturas, formas de armazenamento e tipos de dados, me deparei com o chamado SQL_Variant. Pensei, SQL_Variant(Variante SQL), esta ai a resposta para estas perguntas. Sendo assim me aprofundei no assunto, o que acabou resultando neste ecei ent?o conhecer este tipo de dados e consegui identificar a possibilidade de ser utilizado em diversos tipos de dados distintos, mas nem todos os tipos mais conhecidos s?o possíveis de serem aplicados diretamente. Por outro lado, tipos de dados, como Char, Int e Binary podem ser armazenados naturalmente.Conhecendo o SQL_Variant:O SQL_Variant foi introduzido no SQL Server a partir da vers?o 2000, com objetivo de possibilitar a utiliza??o em uma mesma coluna um conjunto distinto e variado de dados relacionados a tipos e formatos diferentes.A partir do momento em que utilizamos este tipo de dados, estamos for?ando o SQL Server a trabalhar de uma forma variável para realizar os armazenamento dos dados sobre estas colunas, o que poderá resultar em pequenos aumentos no tempo de grava??o dos dados, além do que, podemos gerar um nível de fragmenta??o bem maior que se estivessemos utilizando colunas separadas para armazenar cada dado.Vale ressaltar que uma coluna do tipo SQL_Variant, pode armazenar no máximo 8.016 bytes de dados, isso incluindo:Informa??es do tipo da base de dados que esta sendo utilizada;Informa??es sobre o valor que esta sendo isso o tamanho máximo para armazenar dados para colunas SQL_Variant é de no máximo 8.000 bytes.Utilizar o SQL_Variant é bem simples, desde o processo de cria??o de uma table com colunas SQL_Variant como também nos demais comandos utilizados pela Linguagem DML(Data Manipulation Language – Linguagem de Manipula??o de Dados).O SQL_Variant trabalha de forma similar ao tipo de dados variant existente Microsoft Visual Basic. Este tipo de dados, pode ser utilizado como:Colunas;Par?metros; e Variáveis.Incompatibilidades apresentadas pelo SQL_Variant:Como tudo no mundo, nada é perfeito, o SQL_Variant também apresenta as suas limita??es, dentre elas diversos tipos de dados que n?o podem ser utilizados no processo de inser??o de informa??es para colunas SQL_Variant. A tabela 1, a seguir apresenta a rela??o dos tipos de dados incompatíveis com o SQL_Variant.varchar(max)varbinary(max)nvarchar(max)XmltextNtextimageTimestampsql_variantGeographyhierarchyidGeometryTabela 1 – Tipos de dados incompatíveis e n?o suportados pelo SQL_Variant.N?o somente tipos de dados o SQL_Variant n?o suporta, muitas das mais básicas e comuns fun??es utilizadas pelo SQL Server, também n?o s?o suportadas por este tipo de dados. A tabela 2, apresenta esta rela??o:AVGRADIANSSTDEV[P]IDENTITYROUNDSUMISNUMERICSIGNVAR[P]POWERTabela 2 – Fun??es que n?o oferecem suporte ao SQL_Variant.Por outro lado fun??es como , CAST e CONVERT oferecem suporte, além disso, uma nova fun??o de sistema conhecida como SQL_VARIANT_PROPERTY(), poderá ser utilizada como forma de obten??o de informa??es relacionadas as propriedades e valores armazenadas sobre uma coluna SQL_Variant. Importante: As colunas SQL_Variant n?o possuem suporte a índices Full-Text, alémd disso, n?o podem ser utilizadas em conjunto com as fun??es, CONTAINSTABLE e FREETEXTTABLE.Trabalhando com o SQL_Variant:Agora que já conhecemos um pouco sobre este tipo de dados, suas características, desvantagens e recursos nativos. Vamos come?ar a trabalhar diretamente com ele, utilizando um cenário fictício, mas que poderá ser de grande aprendizagem. Para este cenário vou criar uma tabela, utilizando algumas colunas dentre elas uma com o tipo SQL_Variant. Posteriormente faremos a inser??o dos dados nos formatos Int, Char, Varchar e Float. Em seguida, consultaremos os dados armazenados e por último será realizado uma nova inser??o de dados, que nos mostrará algumas surpresas existentes no SQL_Variant.Montando o ambiente e fazendo uso do SQL_Variant:Bom come?amos a montar o nosso cenário, através da cria??o de uma base de dados chamada Exemplos, em seguida criamos a tabela Produtos, nesta tabela faremos uso do tipo de dados SQL_Variant aplicado a coluna Lote_Fabrica??o. Vale ressaltar que n?o é necessário nenhuma configura??o adicional para trabalhar com o SQL_Variant, muito menos mudan?a no nível de compatibilidade do banco de dados. O Código 1 apresenta o script de cria??o do banco de dados e da tabela Produtos.Código 1 – Criando o Banco de Dados Exemplos e a Tabela Produtos:CREATE DATABASE EXEMPLOSGOUse EXEMPLOSGoCREATE TABLE PRODUTOS (CODIGO INT IDENTITY(1,1) Primary Key, DESCRICAO VARCHAR(100), LOTE_FABRICACAO SQL_VARIANT)ON [PRIMARY] Com o banco de dados e a tabela criada vamos inserir alguns registros em nossa tabela. Observe que neste primeiro bloco de inser??o de registros, estamos trabalhando com dados no formatos: Varchar(), Char(), Int e Float. Um detalhe importante que gostaria de destacar, esta relacionada a veracidade dos dados, em nenhum registro foi respeito qualquer tipo de regra ou conven??o que possa existir quando se referimos a Lote de Fabrica??o de um Produto. O objetivo é expor e apresentar a compatibilidade e armazenamento dos dados em diversos tipos e formatos. O Código 2 apresentado a seguir ilustra o primeiro bloco de inser??o de dados.Código 2 – Inserindo o primeiro bloco de registros:Insert Into PRODUTOS Values('Arroz','ABR-1009');Insert Into PRODUTOS Values('Feij?o','FEI-2010');GoInsert Into PRODUTOS Values('Bolacha 1',209310);Insert Into PRODUTOS Values('Bolacha 2',93133);Insert Into PRODUTOS Values('Bolacha 3',392873);Insert Into PRODUTOS Values('Bolacha 5',209310);GoInsert Into PRODUTOS Values('Biscoito 1',5.25);Insert Into PRODUTOS Values('Biscoito 2',2.00);Insert Into PRODUTOS Values('Biscoito 3',3.250);Insert Into PRODUTOS Values('Biscoito 4',1.553);GoDurante o processo os processos de manipula??o de dados, oriundos dos comandos Insert, Update e Delete. O SQL Server realiza uma análise de compara??o para identificar o tipo de dados e formato que esta sendo passado para inser??o. Neste processo o SQL Server mapeia os valores passados como par?metro, com isso é possível estabelecer a compatibilidade do valor ao tipo de dado ao qual ele pertence.Todos os dados foram mapeados e inseridos de forma natural sem necessitar de qualquer tipo de tratamento ou convers?o implicita, para ilustrar a inser??o dos dados, a Figura 1 apresenta a Tabela Produtos e o primeiros registros inseridos.Figura 1 – Dados inseridos na Tabela esta primeira massa de dados inseridas, vamos continuar nosso processo de inser??o de dados, agora trabalhando com dados no formato DateTime. Nesta parte, poderá evidenciar as surpresas existentes pelo SQL_Variant, no processos de mapeamento dos dados. Para isso, vamos utilizar o Código 3, responsável pela inser??o de dados no formato DateTime.Código 3 – Inserindo o segundo bloco de registros, utilizando o formato DateTimeInsert Into PRODUTOS Values('Biscoito',2011-02-24);Insert Into PRODUTOS Values('Biscoito',2011-02-25);Insert Into PRODUTOS Values('Biscoito',2011-02-26);Insert Into PRODUTOS Values('Biscoito',2011-02-27);Insert Into PRODUTOS Values('Biscoito',2011-02-28);GoNossos novos dados já foram inseridos, aparentemente sem nenhum problema, mas se utilizarmos o comando Select para apresentar o atual conjunto de registros de nossa tabela Produtos, teremos a surpresa. Os valores declarados para o campo Lote_Fabricacao no comando Insert utilizado pelo Código 3, foram convertidas para o formato e tipo de dados Integer, onde todos os valores de data foram recalculados e somandos para valores que indicam um ano em nosso calendário. A Figura 2 apresenta o resultado do comando Select.Figura 2 – Dados inseridos no formato DateTime convertidos para o formato Integer.Após observarmos os registros inseridos em nossa tabela e o campo Lote_Fabricac?o para as linhas convertidos em valores Integer. Nos apresenta alguns questionamentos:Por qual motivo o SQL Server realizou a convers?o dos Dados?Existe alguma incompatibilidade em se utilizar tipos de dados DateTime?Talvez seja necessário utilizar alguma fun??o para mapeamento dos tipos de dados e vincular aos valores especificados no comando Insert?Para todas estas perguntas existem respostas que poderam esclarecer o que aconteceu durante o processo de inser??o. Trata-se de uma resposta simples e direta.O SQL Server realizou a convers?o dos valores para o tipo de dados Int, por entender que estes valores podem ser armazenados neste formato, realizando um cálculado para definir o valor que será armazenado, mesmo que o valor e seu formato esteja especificado como DateTime. Para contornar esta característica do SQL_Variant, é necessário utilizar as fun??es de convers?o de dados implicitas Convert e Cast.N?o existe incompatibilidade do SQL_Variant para armazenar dados no formato DateTime, existe sim uma aten??o para se estabelecer o mapeamento do dado ao seu formato, por isso devemos utilizar as fun??es de convers?o implicatas.Esta convers?o pode parecer estranha ou sem sentido, mas na verdade n?o é basta analisar a forma com que os valores est?o sendo informados, o que for?a ainda mais o SQL Server a entender que estamos trabalhando com uma fórmula matemática, como por exemplo: 2011-02-24, se analisarmos podemos dizer que estamos fazendo a seguinte equa??o: =2011-02-24 = 1985. A tabela 3 apresentada a seguir demonstra o resultado de cada valor inserido como DateTime mas convertido para Int.AnoMêsDiaEqua??oResultados2011224=2011-2-2419852011225=2011-2-2519842011226=2011-2-2619832011227=2011-2-2719822011228=2011-2-281981Tabela 3 – Resultados da convers?o de DateTime para Integer.Neste momento o que nos resta a fazer é realizar novamente a inser??o dos dados no formato DateTime, mas fazendo uso da fun??o Convert para que o mapeamento seja realizado de forma compatível com o formato desejado. O Código 4 apresentado abaixo demonstra como podemos fazer esta nova inser??o.Código 4 – Inserindo o segundo bloco de registros, utilizando o formato DateTime e fun??o Convert.Insert Into PRODUTOS Values('Biscoito',Convert(DateTime,2011-02-24));Insert Into PRODUTOS Values('Biscoito', Convert(DateTime,2011-02-25));Insert Into PRODUTOS Values('Biscoito', Convert(DateTime,2011-02-26));Insert Into PRODUTOS Values('Biscoito', Convert(DateTime,2011-02-27));Insert Into PRODUTOS Values('Biscoito', Convert(DateTime,2011-02-28));GoApós esta nova inser??o de dados utilizando a fun??o de convers?o Convert nossos dados est?o armazenados de forma correta respeitos seu formato e tipo de dados.Conclus?o:Utilizar uma coluna do tipo SQL_Variant nos apresenta diversas vantagens quando temos a necessidade de armazenar informa??es em uma tabela sem se preocupar com o tipo de dados, formato ou se este dado é compatível com a coluna a qual esta sendo inserido. Por outro lado, nem sempre temos esta possibilidade e como podemos observar alguns tipos de dados, dentre eles, o Datetime necessitou de um tratamento antes de ser armazenado, fazendo-se uso de fun??es de convers?o implicitas de dados Convert e Cast.Espero que este artigo posso ter respondido as dúvidas dos meus alunos e apresentado para você leitor como podemos trabalhar com dados distintos na mesma área de armazenado.Agrade?o a sua aten??o, nos vemos no próximo artigo, até mais. ................
................

In order to avoid copyright disputes, this page is only a partial summary.

Google Online Preview   Download