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.Avalie 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).A escrita dessa consulta SQL está correta em
AI, apenas.
BIV, apenas.
CI e III, apenas.
DI e IV, apenas.
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.