Clique no banner para conhecer e adquirir o meu treinamento de Bancos de Dados no Azure

SQL Server – Msg 443 Invalid use of a side-effecting operator ‘rand’ within a function

Post Views 1,663 views
Reading time 3 minutes

Olá pessoal,
Boa tarde.

Neste post, vou demonstrar como contornar uma limitação do SQL Server, que é o uso da função RAND() em funções UDF, de forma que você possa gerar valores aleatórios e aplicar em uma tabela. Caso você tente fazê-lo, o SQL Server irá retornar essa mensagem de erro:

Msg 443, Level 16, State 1, Procedure fncGera_Senha, Line 50
Invalid use of a side-effecting operator ‘rand’ within a function.

Para contornar isso, existem várias formas, mas vou citar as 2 mais simples logo abaixo.

Criar uma view retornando a função RAND()

Uma alternativa simples para contornar esse problema, é criar uma view utilizando a função RAND(), que pode ser acessada pela função UDF. Veja abaixo como fazer:

Em um uso mais simples. basta alterar a sua função UDF para que ao invés de utilizar a função RAND(), você faça um SELECT [rand] FROM vwRand.

Exemplo:

Para gerar dados aleatórios a partir de um resultset, você poderia fazer algo assim:

Ficando os dados aleatórios sendo gerados desta forma:

Essa solução parecer ter resolvido o nosso problema. Parece..

Como vocês podem ver, para gerar 1 valor aleatório, essa solução atende perfeitamente nossa necessidade, mas ao utilizar uma tabela pré-existente para gerar vários registros aleatórios, o resultado não saiu conforme o esperado, pois apenas 1 registro aleatório foi gerado e os outros se repetem nas demais linhas da tabela.

Substituindo o uso da função RAND() na sua UDF

Essa solução é mais simples de ser implementada e é mais performática, mas vamos analisar se ela realmente satisfaz nossos requisitos. Ela consiste basicamente em criar uma nova função UDF com o código abaixo, que simule o comportamento aleatório da função RAND(), e utilizá-la sua UDF.

Código-fonte da nova função UDF que gera dados aleatórios:

E o resultado da execução assim:

Vamos testar agora, gerando os dados fictícios para testes:

E o nosso teste final, que é utilizar uma tabela pra gerar vários registros aleatórios:

Como vocês podem observar, utilizando essa nova UDF, foi possível gerar os dados aleatórios para N registros de uma tabela, ela é mais performática e seu uso também é mais simples.

Espero que tenham gostado dessa dica e até o próximo post.
Abraço!