Suponha a seguinte função:
CREATE FUNCTION [dbo].[ufnTest]()
RETURNS TABLE
AS RETURN SELECT 1 AS Nr
Minha função real selecionará dados reais de muitas tabelas diferentes. Eu (principalmente) entendo os riscos de usar dicas nolock e decidi que, neste caso, eu realmente as quero. Então eu tento chamar a função acima assim:
SELECT * FROM [dbo].[ufnTest]() WITH(NOLOCK)
No entanto, isso falha com a seguinte mensagem:
Sintaxe incorreta perto da palavra-chave 'with'. Se esta instrução for uma expressão de tabela comum, uma cláusula xmlnamespaces ou uma cláusula de contexto de controle de alterações, a instrução anterior deverá ser finalizada com um ponto e vírgula.
As dicas para corrigir esse erro não são relevantes. Talvez esta dica de tabela não esteja disponível para funções com valor de tabela?
Existem várias alternativas que eu consideraria. Uma é usar a dica em todas as tabelas em minha consulta de seleção, mas prefiro não fazer isso porque (a) terei que me lembrar disso sempre que mudar a função e (b) é repetitivo. Outra alternativa seria SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
, mas uma desvantagem é que não sei bem como defini-lo como era antes (e as declarações após o select do meu TVF devem ter o nível de isolamento original).
Então, eu prefiro fazer WITH (NOLOCK)
uma seleção de um trabalho de função com valor de tabela. Isso é possível?
Você não pode usar a
WITH (NOLOCK)
em uma função com valor de tabela, a menos que você o coloque em cada tabela no código dentro da função.Sua melhor aposta seria, como você disse, para
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
.Para alterar isso de volta para o padrão, você precisa descobrir qual nível de isolamento está definido atualmente (antes de alterá-lo acima).
Isso pode ser feito executando
DBCC USEROPTIONS
e verificando o valor deisolation level
.O padrão tende a ser
READ COMMITTED
, portanto, para alterá-lo, você deve escrever uma declaração como a seguinte:SET TRANSACTION ISOLATION LEVEL READ COMMITTED