Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да генерирам произволно число за всеки ред в T-SQL избор?

Обърнете внимание на SQL Server – Задаване на базирани произволни числа, което има много подробно обяснение.

За да обобщим, следният код генерира произволно число между 0 и 13 включително с равномерно разпределение:

ABS(CHECKSUM(NewId())) % 14
 

За да промените своя диапазон, просто променете числото в края на израза. Бъдете особено внимателни, ако имате нужда от диапазон, който включва както положителни, така и отрицателни числа. Ако го направите погрешно, е възможно да преброите двойно числото 0.

Малко предупреждение за математическите ядки в стаята:има много леко пристрастие в този код. CHECKSUM() води до числа, които са еднакви в целия диапазон на типа данни sql Int или поне толкова близо, колкото може да покаже моето (редакторното) тестване. Въпреки това, ще има известно отклонение, когато CHECKSUM() произвежда число в най-горния край на този диапазон. Всеки път, когато получите число между максимално възможното цяло число и последното точно кратно на размера на желания диапазон (14 в този случай) преди това максимално цяло число, тези резултати се предпочитат пред останалата част от вашия диапазон, която не може да бъде произведена от това последно кратно на 14.

Като пример, представете си, че целият диапазон на типа Int е само 19. 19 е възможно най-голямото цяло число, което можете да задържите. Когато CHECKSUM() води до 14-19, те съответстват на резултати 0-5. Тези числа биха били силно предпочитан пред 6-13, защото CHECKSUM() е два пъти по-вероятно да ги генерира. По-лесно е да се демонстрира това визуално. По-долу е целият възможен набор от резултати за нашия въображаем диапазон от цели числа:

Цяло число на контролната сума:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Резултат от диапазона:0 1 2 3 4 5 6 7 8 9 10 11 12 5  

Тук можете да видите, че има повече шансове за генериране на някои числа от други:пристрастие. За щастие действителният диапазон на типа Int е много по-голям... толкова много, че в повечето случаи отклонението е почти неоткриваемо. Все пак трябва да имате предвид, ако някога се окажете, че правите това за сериозен код за сигурност.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Създайте вградена функция с таблица с стойност (ITVF) в SQL Server

  2. SUBSTRING Команда в SQL:Пример

  3. Неочаквано поведение @@rowcount в UDF в MS SQL 2019

  4. TSQL Pivot без агрегатна функция

  5. TODATETIMEOFFSET() Примери в SQL Server