NOLOCK ou WITH (NOLOCK): Qual a sintaxe correta?

A hint “nolock” permite que o processador do SQL Server não utilize bloqueios (LOCK) durante a leitura de informações, comportamento denominado de leitura suja. Esse é um truque velho e conhecido do SQL Server 2000 e que muitos desenvolvedores tem utilizado. O objetivo desse post é orientar sobre a a sintaxe correta do NOLOCK.

Links relacionados

A palavra ‘WITH’ logo depois o nome da tabela é recomendada, mas opcional:

SELECT * FROM tabela WITH (NOLOCK) -- CORRETO

SELECT * FROM tabela (NOLOCK) -- CORRETO

Ambos os comandos funcionam com sucesso. Por que então recomendar o uso da palavra opcional ‘WITH’?

 

Motivo 1: A partir do SQL Server 2005, a sintaxe do NOLOCK ficou mais rigorosa. Múltiplas hints funcionam somente com a palavra WITH.

SELECT * FROM tabela (Index=idxSeek, NOLOCK) -- NAO FUNCIONA

SELECT * FROM tabela WITH (Index=idxSeek, NOLOCK) -- CORRETO

.

Motivo 2: E se o desenvolvedor esquecer de colocar os parênteses? Parece piada, mas isso ocorre.

SELECT * FROM tabela NOLOCK -- Criamos um alias para a tabela

O comportamento é interessante: a query funciona, mas o NOLOCK é ignorado. As pessoas acham que é um BUG do SQL Server. Na realidade, foi apenas erro de digitação.