sto usando SQL Server 2012.dichiarazione Causa T-SQL strano comportamento con newid() come fonte di casualità
Se io quanto segue per ottenere un elenco di numeri casuali-ish nel range [1,3 ], funziona perfettamente:
SELECT TOP 100
ABS(CHECKSUM(NEWID()))%3 + 1 [value_of_rand]
FROM sys.objects
e ottengo cose piacevoli come questa (tutte tra 1 e 3).
3
2
2
2
1
....etc.
Ma se Ho poi messo l'uscita di quella stessa funzione-random-valore incatenato in una dichiarazione caso, a quanto pare non produce solo i valori 1,2,3.
SELECT TOP 100
CASE (ABS(CHECKSUM(NEWID()))%3 + 1)
WHEN 1
THEN 'one'
WHEN 2
THEN 'two'
WHEN 3
THEN 'three'
ELSE
'that is strange'
END [value_of_case]
FROM sys.objects
Produce:
three
that is strange
that is strange
one
two
...etc
che cosa sto facendo male qui?
Potrebbe essere che in sede di presentazione del numero è arrotondamento, ma quando la valutazione non è? Prova a metterlo in una variabile e fai il debugging/buttando il valore dove hai "che è strano". – Dane
Se lo assegno a una variabile e poi faccio l'istruzione case contro quella variabile, funziona bene, nessuna stranezza. Tuttavia, penso che il tuo metodo di debugging non sia possibile. Viene visualizzato un errore che dice "Un'istruzione SELECT che assegna un valore a una variabile non deve essere combinata con le operazioni di recupero dei dati." se provo a fare qualcosa di simile: DECLARE @a int; seleziona @a = (ABS (checksum (newid()))% 3 + 1), CASE @a \t QUANDO 1 ALLORA 'uno' QUANDO 2 POI 'due' \t QUANDO 3 POI 'tre' \t ELSE 'strano:' + cast (@a come varchar (max)) END – Anssssss
si può sempre rimuovere l'intero caso 'WHEN 3' e mettere il' tre' in 'ELSE' –