View Full Version : سوال: ما تو SQL دستور random داريم
ehsan_wwe
پنج شنبه 10 دی 1388, 20:09 عصر
ها .....
سلام به همه برنامه نويس هاي ماه و مهندس :لبخند:
يه سوالي برام پيش اومد و دوست دارم جوابش مثبت باشه
رندم تو SQL چه شكليه طرز استفادش
AminSobati
پنج شنبه 10 دی 1388, 21:04 عصر
سلام دوست عزیزم،
از تابع RAND استفاده کنین
ehsan_wwe
پنج شنبه 10 دی 1388, 21:16 عصر
يك مثال ميشه بزنيد ؟
ببينم چطوريه
مثلا يك كد ره گيري بده
AminSobati
پنج شنبه 10 دی 1388, 23:33 عصر
SELECT RAND(100), RAND(), RAND()
Hamid.Kad
پنج شنبه 10 دی 1388, 23:45 عصر
مثلاً اگر میخواهید کد رهگیری بین 1000 و 1500 باشه از دستور زیر استفاده میکنید.
Cast(RAND()*500 + 1000 as INT)
و یا کد زیر یک کاراکتر تصادفی برای شما نشان میدهد
CHAR(Cast(RAND()*26 + 97 as INT))
خلاصه نوع کد به انتخاب خودتونه. ولی قبلش چک کنید که کد تکراری نباشه.
البته استفاده از روش زیر هم بد نیست:
PRINT NEWID()
یک کد 36 کاراکتری هگزا دسیمال برمیگردونه (4 تاش علامت - است)
SELECT RAND(100), RAND(), RAND()
البته جناب ثباتی جسارتاً این کد شما همیشه یه مقدار برمیگردونه. اگر اون عدد 100 رو حذف کنید خیلی بهتر میشه
AminSobati
جمعه 11 دی 1388, 00:03 صبح
عدد 100 بعنوان Seed استفاده شده، میتونین حذف کنین یا Seed رو تغییر بدین
Hamid.Kad
جمعه 11 دی 1388, 00:20 صبح
بله. و اشکالش اینه که همش کد تکراری میده و حتی روی Seed های بعدی هم اثر میذاره و اونها هم تکراری برمیگردونن.
AminSobati
جمعه 11 دی 1388, 09:31 صبح
SELECT RAND( (DATEPART(mm, GETDATE()) * 100000 )
+ (DATEPART(ss, GETDATE()) * 1000 )
+ DATEPART(ms, GETDATE()) )
Hamid.Kad
جمعه 11 دی 1388, 11:33 صبح
فکر کنم منظورتون از mm توی عبارت اول mi بوده. چون اینجوری تا یک ماه بدون تغییر میمونه !
چرا نتیجه ها در 100000 و 1000 شدند ؟
و یه سوال دیگه اینکه اصولاً چرا از Seed استفاده میشه ؟
دلیل خاصی داره ؟
محمد سلیم آبادی
جمعه 11 دی 1388, 16:29 عصر
يك مثال ميشه بزنيد ؟
ببينم چطوريه
مثلا يك كد ره گيري بده
تابع RAND تنها اعدادی بین بازه ی 1 و 0 تولید می کند و برای نیاز شما مناسب نیست. بهترین حالت استفاده از تابع NEWID است.
SELECT RAND( (DATEPART(mm, GETDATE()) * 100000 )
+ (DATEPART(ss, GETDATE()) * 1000 )
+ DATEPART(ms, GETDATE()) )
نکته ای که وجود دارد این که توابع getdate و rand در هر کوئری یک بار بیشتر اجرا نمی شوند مثلا اگر کوئری زیر را اجرا کنین داده های تکرار خواهید دید:
SELECT RAND( (DATEPART(mm, GETDATE()) * 100000 )
+ (DATEPART(ss, GETDATE()) * 1000 )
+ DATEPART(ms, GETDATE()) )
from sys.columns
AminSobati
جمعه 11 دی 1388, 20:05 عصر
تولید کردن عدد رندوم در یک کوئری موضوع متفاوتی هست. البته با نوشتن تابع میشه SQL Server رو وادار کرد که GETDATEهای متنوع تری بدست بیاد:
create function GetDate2()
returns datetime
as
begin
return getdate()
end
select dbo.GetDate2() from sys.columns cross join sys.columns t2
ولی ممکنه Batch شما خیلی کوچک باشه به شکلی که چند رکورد، در کوچکترین واحد زمان بدست بیان. پس RAND اونها هم مشابه میشه. در کوئری بالا هم میتونیم این مشکل رو در چند رکورد پشت سر هم ببینیم.
لذا بهتره در این نمونه ها، استفاده از زمان بعنوان Seed رو فراموش کرد. بعنوان جایگزین، checksum روی PK (یا روی row_number) جواب میده
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.