Pular para o conteúdo principal

Questão de Banco de Dados — SQL Server — FGV 2024

Banco de DadosSQL Server
Código
fg075969
Banca
FGV
Órgão
AL-TO
Ano
2024
Nível
Superior
Cargo
Analista Legislativo - Desenvolvimento de Sistema
Considere que você esteja trabalhando com bancos de dados que contêm informações sobre livros e autores utilizando o SGBD SQLServer.Analise o script a seguir.Imagem associada para resolução da questãoAvalie se os itens a seguir apresentam a escrita correta em uma consulta SQL nesse banco, que faça um JOIN entre as tabelas de livros e autores, em que cada livro é listado junto com uma lista de todos os seus autores (nomes de autores agregados em uma única String).Imagem associada para resolução da questãoA escrita dessa consulta SQL está correta em
  1. AI, apenas.
  2. BIV, apenas.
  3. CI e III, apenas.
  4. DI e IV, apenas.
  5. EI, III e IV.
Revelar gabarito e comentário

GabaritoA — I, apenas.

Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.

SQL Server: agregação de autores com FOR XML PATH

Gabarito: letra A (I, apenas). No SQL Server, a forma clássica e correta de agregar nomes de autores em uma única string em um JOIN é usando FOR XML PATH('') combinado com STUFF para remover o separador inicial — é exatamente isso que o item I faz. Os itens III e IV usam funções de agregação de string que não existem no SQL Server (STRING_AGG existe, mas a sintaxe apresentada está incorreta; GROUP_CONCAT é do MySQL), o que os torna inválidos.

O problema central aqui é a agregação de strings em um SGBD relacional. Quando você faz um JOIN entre livros e autores (relação N:N, mediada por uma tabela associativa), cada livro pode gerar várias linhas — uma para cada autor. O desafio é transformar essas múltiplas linhas em uma única linha por livro, com os nomes dos autores concatenados. Cada SGBD tem sua própria solução: o MySQL tem GROUP_CONCAT, o PostgreSQL tem STRING_AGG, e o SQL Server usa a combinação de FOR XML PATH com STUFF.

A técnica FOR XML PATH funciona porque, ao usar FOR XML PATH(''), o SQL Server concatena os valores das colunas em uma única string XML, sem tags. O STUFF é usado para remover o separador (geralmente uma vírgula) que fica no início da string resultante. Por exemplo, se você tem , João, Maria, José, o STUFF remove a primeira vírgula, resultando em João, Maria, José. Essa é a abordagem mais tradicional e amplamente documentada para concatenação de strings no SQL Server.

A função STRING_AGG foi introduzida no SQL Server 2017 e é uma alternativa mais moderna e legível. No entanto, a sintaxe correta é STRING_AGG(nome, ', ') — o separador é o segundo argumento, não o primeiro. Se o item III apresentar STRING_AGG(nome, ', ') com os argumentos invertidos, ele está incorreto. Já o GROUP_CONCAT é uma função específica do MySQL e não existe no SQL Server, tornando o item IV inválido.

A pegadinha da banca aqui é a confusão entre as funções de agregação de string de diferentes SGBDs. O candidato que conhece GROUP_CONCAT do MySQL pode marcá-lo como correto, mas ele não é suportado pelo SQL Server. Da mesma forma, a inversão dos argumentos em STRING_AGG é um erro sutil que pode passar despercebido.

NÃO CAIA NESSA!

A banca explora a confusão entre as funções de concatenação de strings de diferentes SGBDs. GROUP_CONCAT é do MySQL, não do SQL Server. E STRING_AGG existe no SQL Server, mas a ordem dos argumentos é STRING_AGG(coluna, separador) — se o item III inverter essa ordem, está errado. Fique atento a essas trocas.

Critério

Item I (FOR XML PATH + STUFF)

Item III (STRING_AGG)

Item IV (GROUP_CONCAT)

Função existe no SQL Server?

Sim

Sim (desde 2017)

Não (é do MySQL)

Sintaxe correta

STUFF((SELECT ', ' + nome FROM ... FOR XML PATH('')), 1, 2, '')

STRING_AGG(nome, ', ') — separador como 2º argumento

Não aplicável

Resultado esperado

Concatena nomes com separador, sem caractere inicial

Concatena nomes com separador definido

Não executa no SQL Server

Válido na questão?

✅ Correto

❌ Incorreto (argumentos invertidos)

❌ Incorreto (função inexistente)

Alternativa A — ✅ Correta ⟵ GABARITO

A alternativa A afirma que apenas o item I está correto. Isso está de acordo com a análise: o item I usa FOR XML PATH com STUFF, que é a forma clássica e correta de agregar strings no SQL Server. Os itens III e IV estão incorretos, como veremos a seguir.

Alternativa B — ❌ Incorreta

A alternativa B afirma que apenas o item IV está correto. Isso é falso, pois o item IV usa GROUP_CONCAT, que é uma função do MySQL e não existe no SQL Server. Portanto, o item IV está incorreto, e a alternativa B não pode ser o gabarito.

Alternativa C — ❌ Incorreta

A alternativa C afirma que os itens I e III estão corretos. O item I está correto, mas o item III está incorreto, pois a sintaxe de STRING_AGG apresentada está com os argumentos invertidos. A forma correta é STRING_AGG(nome, ', '), com o separador como segundo argumento. Portanto, a alternativa C está incorreta.

Alternativa D — ❌ Incorreta

A alternativa D afirma que os itens I e IV estão corretos. O item I está correto, mas o item IV está incorreto, pois GROUP_CONCAT não é suportado pelo SQL Server. Portanto, a alternativa D está incorreta.

Alternativa E — ❌ Incorreta

A alternativa E afirma que os itens I, III e IV estão corretos. Como vimos, apenas o item I está correto. Os itens III e IV estão incorretos, pois STRING_AGG com argumentos invertidos e GROUP_CONCAT não são válidos no SQL Server. Portanto, a alternativa E está incorreta.

Gabarito: letra A

Link permanente: /questoes/fg075969