Published on

March 17, 2021

Генерация случайных чисел в SQL Server

Вам когда-нибудь понадобилось сгенерировать случайные числа в SQL Server? Возможно, вы столкнулись с функцией RAND(), но поняли, что она генерирует одно и то же число для каждой строки. В этой статье мы рассмотрим лучшее решение с использованием функции CRYPT_GEN_RANDOM().

Ранее я написал статью в блоге о том, как генерировать случайные числа в SQL Server с помощью функций CHECKSUM() и NEWID(). Хотя это работало, оно могло быть немного громоздким. Однако недавно я наткнулся на функцию, которой раньше не замечал – CRYPT_GEN_RANDOM(). Эта функция создает случайное двоичное значение, которое может быть преобразовано в число с помощью CAST().

Давайте рассмотрим пример. Предположим, у нас есть таблица с названием “sys.databases”, и мы хотим сгенерировать случайное число для каждой строки. Раньше мы могли использовать функцию RAND() и столкнуться с проблемой генерации одного и того же числа для каждой строки. Но теперь мы можем использовать CRYPT_GEN_RANDOM(), чтобы генерировать уникальные двоичные значения.

SELECT database_id, CAST(CRYPT_GEN_RANDOM(1) AS INT) AS RandomNumber
FROM sys.databases

Заменив RAND() на CRYPT_GEN_RANDOM(1), мы видим, что каждое случайно сгенерированное двоичное значение отличается. Чтобы преобразовать его в число, мы просто используем CAST().

Конечно, вы можете изменить длину двоичного значения, изменив параметр в CRYPT_GEN_RANDOM(). Это позволяет генерировать более крупные числа при необходимости.

В целом, CRYPT_GEN_RANDOM() теперь является моим основным генератором случайных чисел в SQL Server. Он предоставляет простой и эффективный способ генерации случайного числа для каждой строки в вашем наборе результатов. Удивительно, как такая полезная функция могла остаться незамеченной так долго!

В следующий раз, когда вам понадобится сгенерировать случайные числа в SQL Server, попробуйте использовать CRYPT_GEN_RANDOM(). Вы будете впечатлены его производительностью и простотой использования.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.