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

SQL Server – Msg 443 Invalid use of a side-effecting operator ‘rand’ within a function
5 (100%) 1 votos

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!

SQL, sql server, sql server 2008, sql server 2008 R2, Oracle, Oracle Database, Oracle 11g, Oracle 10g, Oracle 12c, MySQL, Firebird, Consultoria, Consultor, Programador, Programação. Desenvolvedor, Analista de Sistemas, DBA, Criação de website, Criação de Sistema Web, Vitória, Vila Velha, Guarapari, Espírito Santo, ES, Consultoria SQL em VItória, Treinamento, Curso, Prestação de serviço, prestar serviço, freelancer, freela, banco de dados, consultoria em banco de dados, consultor de banco de dados

Deixe um comentário

Seja o Primeiro a Comentar!

Deixe uma resposta

wpDiscuz