Usar palavras reservadas para nomear objetos não é uma boa ...

Próximas questões
Com base no mesmo assunto
Q914451 Banco de Dados

Usar palavras reservadas para nomear objetos não é uma boa ideia, mas no MS SQL Server é possível usar palavras reservadas em certos objetos, desde que, por ocasião da utilização esses objetos, seus nomes sejam de forma especial.

Observe os dois comandos SQL a seguir.


select "having" from teste

where between <> 'between';

select [having] from teste

where [between] <> 'between';


Sobre esses comandos, analise as afirmativas a seguir.

I. O resultado do primeiro comando é sempre vazio.

II. O primeiro comando causa um erro de compilação.

III. O resultado do segundo comando é sempre vazio.

IV. O segundo comando causa um erro de compilação.


Está correto o que se afirma em

Alternativas

Gabarito comentado

Confira o gabarito comentado por um dos nossos professores

A alternativa correta é a A - II, somente.

Para entender essa questão, é importante saber que o SQL Server permite a utilização de palavras reservadas como identificadores de objetos, tais como nomes de colunas ou tabelas. No entanto, para fazer isso sem causar confusão no interpretador do SQL, esses identificadores devem ser delimitados de uma maneira especial, utilizando colchetes [ ] ou aspas duplas " ".

Olhando para o primeiro comando apresentado na questão:

select "having" from teste
where between <> 'between';

Esse comando tenta selecionar uma coluna chamada having da tabela teste, e logo em seguida usa a palavra reservada between de forma incorreta, causando um erro de compilação. A palavra reservada between é usada em SQL para definir um intervalo em uma condição WHERE, e a sua utilização nesse contexto não faz sentido, pois falta a especificação do intervalo e da coluna à qual o intervalo se aplica. Por isso, a afirmação II está correta.

Quanto ao segundo comando:

select [having] from teste
where [between] <> 'between';

Aqui, os identificadores estão corretamente delimitados por colchetes, o que permite que o comando seja interpretado sem erros pelo SQL Server. Portanto, o comando não causa erro de compilação, e o resultado do comando não é necessariamente vazio, pois dependerá dos dados presentes na tabela teste. Isso torna as afirmações I, III e IV incorretas.

Portanto, a única afirmação correta é a II, indicando que somente o primeiro comando causaria um erro de compilação, fazendo da alternativa A a resposta correta.

Clique para visualizar este gabarito

Visualize o gabarito desta questão clicando no botão abaixo

Comentários

Veja os comentários dos nossos alunos

Os identificadores delimitados são postos entre colchetes ([ ]). A seguir, um exemplo de uma instrução DMX com identificador delimitado que obedece essas regras. SELECT * FROM [Marketing_Clusters].CONTENT; O identificador que não atender as regras para o formato dos identificadores normais deverá ser sempre delimitado. A seguir, é mostrado um exemplo de instrução DMX com identificador delimitado que contém um espaço: SELECT * FROM [Targeted Mailing].CONTENT; Use identificadores delimitados nas seguintes situações: Quando palavras reservadas forem usadas em nomes de objeto ou partes de nomes de objeto. É recomendável não usar palavras-chave reservadas como nomes de objeto. Bancos de dados que você atualizar de versões anteriores do Serviços de análise podem conter identificadores que incluem palavras que não foram reservadas na versão anterior do Serviços de análise , mas que são palavras reservadas paraSQL Server 2019 (15.x) Serviços de análise. Um identificador delimitado pode ser usado para fazer referência a um objeto assim, até que seja possível alterar o nome do objeto. Quando se usam caracteres que não estão listados como identificadores qualificados. No Serviços de análise, é possível usar qualquer caractere da página de código atual em um identificador delimitado; no entanto, o uso indiscriminado de caracteres especiais em um nome de objeto pode tornar as instruções DMX difíceis de ler e manter. referência: https://docs.microsoft.com/pt-br/sql/dmx/identifiers-dmx?view=sql-server-ver15

Ainda não tinha estudado sobre esse conceito. Segue o link da documentação oficial.

Fonte: https://docs.microsoft.com/pt-br/sql/relational-databases/databases/database-identifiers?view=sql-server-ver15

select "having" from teste where between <> 'between';

Esse between precisa estar entre "" ou []

select [having] from teste where [between] <> 'between';

Correto, o segundo 'between' é só uma string, não uma coluna

 

"Quando identificadores são usados nas instruções Transact-SQL , os identificadores que não estiverem de acordo com essas regras deverão ser delimitados por aspas duplas ou colchetes."

https://docs.microsoft.com/pt-br/sql/relational-databases/databases/database-identifiers?view=sql-server-ver15

O primeiro comando resultará em um erro de compilação, pois a palavra reservada "having" é usada como um identificador sem estar entre colchetes, e o operador "between" também é uma palavra reservada e não pode ser usado dessa maneira.

O segundo comando irá compilar sem erros, pois as palavras reservadas "having" e "between" são usadas como identificadores e estão entre colchetes. No entanto, a cláusula WHERE do comando está comparando a coluna "between" com a string "between", o que pode resultar em resultados diferentes dependendo dos dados na tabela.

Clique para visualizar este comentário

Visualize os comentários desta questão clicando no botão abaixo