Joana trabalha com extração e consolidação de dados e precisa ter acesso aos metadados de um banco de dados SQL Server para compreender melhor o modelo e as estruturas utilizadas. Para começar, Joana resolveu criar uma consulta SQL que produza uma lista das tabelas, com as respectivas colunas com seus tipos de dados e outras propriedades. O comando que Joana deve usar é:
- A)select s1.name tabela, s2.name coluna, s3.name tipo, s2.iscomputed, s2.isnullable from sysobjects s1, syscolumns s2, systypes s3 where s1.xtype='T' and s1.xid=s2.xid and s2.xtype=s3.xtype and s2.xusertype=s3.xusertype order by s1.name, s2.name
Errada, porque usa xtype='T' e a junção s1.xid = s2.xid, campos que não correspondem corretamente às tabelas de sistema para listar tabelas de usuário.
- B)select s1.name tabela, s2.name coluna, s3.name tipo, s2.iscomputed, s2.isnullable from systables s1, syscolumns s2, systypes s3 where s1.xcode=s2.xcode and s2.xtype=s3.xtype and s2.xusertype=s3.xusertype order by s1.name, s2.name
Errada, pois systables e xcode não são a combinação adequada para esse catálogo de metadados no SQL Server.
- C)select s1.name tabela, s2.name coluna, s3.name tipo, s3.iscomputed, s3.isnullable from systables s1, syscolumns s2, systypes s3 where s1.tableid=s2.tableid and s2.xtype=s3.xtype and s2.xusertype=s3.xusertype order by s1.name, s2.name
Errada, porque usa systables e ainda atribui iscomputed e isnullable a s3, quando essas propriedades pertencem à coluna, não ao tipo.
- D)select s1.name tabela, s2.name coluna, s3.name tipo, s2.iscomputed, s2.isnullable from sysobjects s1, syscolumns s2, systypes s3 where s1.xtype='U' and s1.id=s2.id and s2.xtype=s3.xtype and s2.xusertype=s3.xusertype order by s1.name, s2.name
Certa, pois sysobjects com xtype='U' identifica tabelas de usuário e a junção por id com syscolumns recupera colunas, enquanto systypes traz o tipo de dado.
- E)select s1.name tabela, s2.name coluna, s3.name tipo, s2.iscomputed, s2.isnullable from systables s1, syscolumns s2, sysobjects s3 where s1.xid=s2.xid and s2.xtype=s3.xtype and s2.xusertype=s3.xusertype order by s1.name, s2.name
Errada, porque mistura systables com sysobjects de forma incoerente e não faz a junção correta para obter as colunas das tabelas.
Gabarito: D
Quando a ideia é “espionar” a estrutura do banco, você precisa consultar as tabelas de metadados do próprio SQL Server. Em versões mais antigas, isso era feito com views/tabelas de sistema como sysobjects, syscolumns e systypes, que permitem listar tabelas, colunas e seus tipos de dados. É aquele tipo de consulta que parece burocrática, mas salva tempo quando você precisa entender um banco que ninguém documentou direito. Na questão, Joana quer uma lista das tabelas com as respectivas colunas, tipos e propriedades como se a coluna é calculada ou nula. Para isso, a consulta deve pegar os objetos do tipo tabela e relacioná-los com as colunas pelo identificador do objeto, além de associar cada coluna ao seu tipo em systypes. O gabarito é a letra D porque ela usa sysobjects para as tabelas, filtra xtype='U', que identifica tabela de usuário no SQL Server, e faz a ligação correta por s1.id = s2.id. Depois, relaciona syscolumns com systypes por xtype e xusertype, recuperando o nome do tipo e outras propriedades da coluna. Em termos práticos, é exatamente o caminho para montar um inventário de tabelas e colunas. As demais opções erram por usar tabelas que não correspondem ao catálogo correto, por empregar campos de junção inexistentes ou por confundir o identificador do tipo de objeto. Em prova de SQL Server, banca adora essa troca de nomes parecidos para ver se você cai no detalhe.