Trabalhando com XML no SQL Nível - Intermediário Por: Francisco Drumond Algumas vezes nos deparamos com a necessidade de armazenar informações em um banco de dados de forma mais dinâmica. Não sabemos ao certo se haverá inclusão de novos campos e a cada alteração que fazemos precisamos criar um novo campo em nosso banco de dados. Uma solução bastante viável que pode ser usada é a persistência de informações em forma de XML (Extensible Markup Language). É claro que por questões de desempenho nem sempre podemos usar esse tipo de solução, mas se a intenção é salvar informações que tem modificações constantes dos dados que serão persistidos, essa se tornará uma solução bem simples de ser implementada e usada em seus sistemas. Vamos pensar de maneira mais prática, vamos imaginar que temos a necessidade de salvar algumas informações de veículos, porém existe alteração constante das informações que estamos salvando. A cada semana nos pedem para incluir um novo campo e outros deixam de existir, e todo aquele processo de solicitação para o DBA leva dias. Sendo assim, vamos usar uma solução mais simples. Passei algumas informações menos sensíveis para um XML que ficou com o formato abaixo: <Car> <price>20000</price> <make>volkswagen</make> <model>gol</model> <color>preto</color> <year>2008</year> <fuel>gnvl</fuel> <doors>5</doors> <seats>5</seats> <gears>5</gears> <mileage>50000</mileage> <transmission>manual</transmission> <engine_size>1781</engine_size> <power>75</power> <region>são Paulo</region> <city>são Paulo</city> <city_area>pinheiros</city_area> <postcode>14725-369</postcode> </Car> E essas informações foram gravadas em um campo Text do meu SQL. Com um select simples recebemos o seguinte retorno do SQL: SELECT CODIGO, XMLINF FROM TB_AUTOMOBILE 1/6
Bom, até aí tudo bem. Agora como vamos usar essa infomação em um sistema sem ter que fazer um parse ou montar novamente meu XML? No próprio SQL podemos usar CONVERT(XML, XMLINF)e isso irá retornar um campo do tipo XML Assim podemos selecionar somente um valor dentro desse XML usando um select um pouco mais elaborado. SELECT T.XMLCOLUMN.value('(//make)[1]', 'varchar(35)') AS 'make' FROM (SELECT CONVERT(XML, XMLINF) AS XMLCOLUMN FROM TB_Automobile) as T Agora podemos perquisar qualquer informação dentro do XML da mesma forma que faríamos com uma tabela comum. Podemos facilitar ainda mais e criar uma VIEW no SQL em que todas as informações necessárias possam ser extraidas diretamente como de uma tabela. CREATE VIEW V_TB_AUTOMOBILE AS ( SELECT T.XMLCOLUMN.value('(//make)[1]','varchar(35)') AS 'make', T.XMLCOLUMN.value('(//model)[1]','varchar(20)') AS 'model', T.XMLCOLUMN.value('(//price)[1]','int') AS 'price', T.XMLCOLUMN.value('(//transmission)[1]','varchar(35)') AS 'transmission', T.XMLCOLUMN.value('(//city)[1]','varchar(35)') AS 'city', T.XMLCOLUMN.value('(//color)[1]','varchar(35)') AS 'color', T.XMLCOLUMN.value('(//year)[1]','int') AS 'years', T.XMLCOLUMN.value('(//fuel)[1]','varchar(35)') AS 'fuel', T.XMLCOLUMN.value('(//doors)[1]','int') AS 'doors', T.XMLCOLUMN.value('(//gears)[1]','int') AS 'gears', T.XMLCOLUMN.value('(//mileage)[1]','int') AS 'mileage', T.XMLCOLUMN.value('(//engine_size)[1]','int') AS 'engine_size', T.XMLCOLUMN.value('(//power)[1]','varchar(35)') AS 'power' FROM (SELECT CONVERT(XML, XMLINF) AS XMLCOLUMN FROM TB_Automobile) as T ) 2/6
Agora posso acessar as informações somente pelo comando SELECT * FROM V_TB_AUTOMOBILE Por se tratar de uma View podemos realizar filtros e ordenar as informações como em uma tabela. SELECT MAKE, MODEL, PRICE, TRANSMISSION, CITY FROM V_TB_AUTOMOBILE WHERE MAKE = 'VOLKSWAGEN' ORDER BY PRICE Usando View no GASweb Dentro do GASweb podemos trabalhar com View sem problemas. Normalmente utilizamos elas na criação de relatórios mais elaborados onde algumas informações necessitam de acesso a várias tabelas. A View criada para acessar as informações persistidas pode ser importada ou criada dentro do GASweb. Com essa facilidade podemos diminuir bastante o tempo gasto no desenvolvimento de algum relatório. 3/6
Criando um Relatório Basicamente temos 2 maneiras de criar um relatório: arrastando um módulo de report para a tela e definindo suas propriedades Ou utilizando a forma automática do GASweb pelo botão O relatório gerado terá a seguinte aparência: 4/6 5/6
Porém, eu gostaria de exibir essas informações em forma de lista. Para isso eu alterei o layout para o modelo abaixo. Como resultado final temos as informações que estão gravadas em formato de XML exibidas em um relatório sem nenhuma dificuldade.
Ainda podemos mostrar essas informações em uma página. Para isso estou exibindo em um Repeater como foi demostrado no 4ª Artigo. No próximo artigo será sobre processo-pré definido no GASweb. Abraços e até a próxima! 6/6