이 게시물 에 따르면 SQL Server에서 임의의 값을 생성하는 올바른 방법은 다음과 같습니다.
ABS(CHECKSUM(NewId())) % 14 -- Returns a value between 0 and 13
그러나 다음과 같은 case 문에서이 표현식을 사용하는 경우 :
SELECT
CASE ABS(CHECKSUM(NEWID())) % 4
WHEN 0 THEN 'String A'
WHEN 1 THEN 'String B'
WHEN 2 THEN 'String C'
WHEN 3 THEN 'String D'
END AS RandomString -- Returns String A, B, C, D and NULLs.
FROM sys.all_objects
이 SQL fiddle 에서 볼 수 있듯이 outputtet RandomString 열에는 일부 NULL이 포함되어 있습니다 . 출력에서 NULL을 피하기 위해 무작위 표현식을 CTE에 래핑 할 수 있음을 발견했지만 위의 코드가 NULL을 반환하는 이유가 궁금합니다.
WITH RandomNumber AS (
SELECT ABS(CHECKSUM(NEWID())) % 4 AS N FROM sys.all_objects
)
SELECT TOP 100
CASE N
WHEN 0 THEN 'String A'
WHEN 1 THEN 'String B'
WHEN 2 THEN 'String C'
WHEN 3 THEN 'String D'
END AS RandomString -- Does not return any NULLs. Only String A, B, C and D.
FROM RandomNumber
약간 다른 방법을 사용하여 난수를 생성하려고 시도했지만 결과는 동일합니다.
CAST(RAND(CHECKSUM(NEWID())) * 4 AS INT) -- Returns a value between 0 and 3
이것은 SQL Server 2014에서 문제인 것 같습니다. 다른 버전에서는 테스트하지 않았습니다.
NULL
특정 표현식이 평가되는 횟수에 대한 보장이 없기 때문에 s를 생성 합니다.
원하는 것은 SQL Server가 다음과 같은 작업을 수행하는 것입니다.
let x = GenerateRandomNumber()
if x = 1 then 'String 1'
if x = 2 then 'String 2'
if x = 3 then 'String 3'
if x = 4 then 'String 4'
(여기서 GenerateRandomNumber()
이다 ABS(CHECKSUM(NEWID())) % 4
); 하지만 SQL Server가 실제로 한 일은 다음과 같습니다.
if GenerateRandomNumber() = 1 then 'String 1'
if GenerateRandomNumber() = 2 then 'String 2'
if GenerateRandomNumber() = 3 then 'String 3'
if GenerateRandomNumber() = 4 then 'String 4'
따라서 NULL
하나의 특정 비교 작업에 대해 올바른 난수를 선택하는 경우 에만 결과 가 나타나지 않습니다.
CTE를 사용하더라도 SQL Server가 위의 두 번째 코드 블록과 같은 것을 생성하지 않을 것이라는 보장 은 없습니다. 안정된 , 생성 된 임의의 숫자 를 원하면 해당 값을 어딘가에 저장 하도록 배열해야합니다 (예 : 테이블 변수 또는 임시 테이블).
내가 보장에 초점을 맞추는 이유 는 현재 관찰 된 행동을 기반으로 코드를 작성하고 싶지 않기 때문입니다. SQL Server 2008이 "순서 지정"을 중지했을 때보고 된 많은 "문제"가 우리가 TOP 100 PERCENT ... ORDER BY
트릭을 사용하고있는 뷰를 생성했습니다 . 2005 및 이전 버전에서 작동했지만 작동하지 않는 현상입니다.
마찬가지로 누군가가 내 숫자를 반환하는 식을 요청하면 식을 5
제공하고 DATEPART(day,GETUTCDATE())
다음 8 시간 동안 원하는만큼 많은 행에 대해 쿼리를 실행하도록 할 수 있습니다. d 문제에 대한 해결책으로 권장합니다.
또한 평가 순서 에 대한 SQL Server의 결정 이 놀라 울 수있는 영역이 있다는 것도 알고 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다