प्रत्येक WHEN क्लॉज के लिए एक नई "यादृच्छिक" संख्या की गणना की जाएगी - इसके बजाय आप एक व्युत्पन्न तालिका का उपयोग कर सकते हैं:
SELECT ID, Name,
Channel =
CASE Rand
WHEN 0 THEN 'Baby Only'
WHEN 1 THEN 'Club'
WHEN 2 THEN 'Drug'
WHEN 3 THEN 'Food'
WHEN 4 THEN 'Internet'
WHEN 5 THEN 'Liquidators'
WHEN 6 THEN 'Mass'
WHEN 7 THEN 'Military'
WHEN 8 THEN 'Other'
WHEN 9 THEN 'Speciality'
ELSE '*NONE*' -- How is this ever getting reached?
END
FROM
( SELECT
id,
name,
ABS(CHECKSUM(NewId())) % 10 Rand
FROM
retailshelf_nil...account A
) zzz;
या क्रॉस अप्लाई सबक्वेरी:
SELECT A.ID, A.Name,
Channel =
CASE zzz.Rand
WHEN 0 THEN 'Baby Only'
WHEN 1 THEN 'Club'
WHEN 2 THEN 'Drug'
WHEN 3 THEN 'Food'
WHEN 4 THEN 'Internet'
WHEN 5 THEN 'Liquidators'
WHEN 6 THEN 'Mass'
WHEN 7 THEN 'Military'
WHEN 8 THEN 'Other'
WHEN 9 THEN 'Speciality'
ELSE '*NONE*' -- How is this ever getting reached?
END
FROM
retailshelf_nil...account A
CROSS APPLY
( SELECT
ABS(CHECKSUM(NewId())) % 10
) zzz (Rand);
इस तरह NewID()
प्रति रिकॉर्ड केवल एक बार कहा जाता है।
एक समान परिदृश्य का समाधान किया गया यहां ।
T-SQL दस्तावेज़ इस घटना की व्याख्या करता है (दी गई है कि यह Sybase के लिए है लेकिन जाहिरा तौर पर अभी भी SQL सर्वर पर लागू होता है):