Преобразовать x-значное случайное число в varchar в SQL Server

Я создаю 14-значное случайное число в SQL Server 2008 R2, используя следующий запрос:

select FLOOR(RAND() * POWER(CAST(10 as BIGINT), 14))

Теперь мне нужно преобразовать это число в varchar, для чего я использую этот запрос:

select 
    convert(varchar(50), FLOOR(RAND() * POWER(CAST(10 as BIGINT), 14)))

Он преобразует число, но в форме 6.74151e+013.

Итак, я попробовал это:

select 
    convert(varchar(50), FLOOR(RAND() * POWER(CAST(10 as BIGINT), 5))) +
    convert(varchar(50), FLOOR(RAND() * POWER(CAST(10 as BIGINT), 5))) + 
    convert(varchar(50), FLOOR(RAND() * POWER(CAST(10 as BIGINT), 4)))

Он создает 14-значный varchar, но я чувствую, что может быть более короткий способ сделать это. Я пробовал и другие способы, но они возвращают ответ в формате 6.74151e+013, который я не могу использовать.

Пожалуйста помоги.

РЕДАКТИРОВАТЬ: Если есть другой способ создания 14-значной случайной числовой строки напрямую (т.е. без использования rand()), то также сообщите об этом.


person rexroxm    schedule 12.01.2017    source источник


Ответы (4)


Я бы использовал CRYPT_GEN_RANDOM, потому что он позволяет указать, сколько случайных байтов вам нужно.

Затем, поскольку вам нужны десятичные, а не шестнадцатеричные цифры, приведите результат к bigint; затем преобразуйте его в varchar и возьмите последние 14 цифр:

SELECT RIGHT(CAST(CAST(CRYPT_GEN_RANDOM(8) AS bigint) AS varchar(50)), 14)

Это можно упростить до:

SELECT RIGHT(CAST(CRYPT_GEN_RANDOM(8) AS bigint), 14)

потому что RIGHT неявно преобразует bigint в varchar.

person Vladimir Baranov    schedule 12.01.2017

Вместо FLOOR() преобразуйте в DECIMAL:

select CONVERT(DECIMAL(14, 0), RAND() * POWER(CAST(10 as BIGINT), 14))

Затем преобразуйте это в varchar:

select CONVERT(VARCHAR(14), 
               CONVERT(DECIMAL(14, 0), RAND() * POWER(CAST(10 as BIGINT), 14))
              )
person Gordon Linoff    schedule 12.01.2017

Пытаться:

select CONVERT(VARCHAR(14),CONVERT(BIGINT,FLOOR(RAND() * POWER(CAST(10 as BIGINT), 14))))
person Ranjana Ghimire    schedule 12.01.2017

Проверь это.

Использование NEWID() .

    select cast(RIGHT(CAST(CAST(NEWID() AS VARBINARY(36)) AS BIGINT), 14) as varchar(50))

ИЛИ Использование rand()

      select convert(varchar(50),convert(numeric(14,0),rand() * 89999999999999))
person Mr. Bhosale    schedule 12.01.2017