My Programming Notes

Here are Notes.... come from debugging

My Programming Notes

Here are Notes.... come from debugging

۱ مطلب با کلمه‌ی کلیدی «Rand» ثبت شده است

دوشنبه, ۱۸ اسفند ۱۳۹۳، ۱۰:۴۴ ب.ظ

تولید یک کاراکتر تصادفی از بین یک گروه کاراکتر

دیروز در بخشی از کارم باید یک رشته 6 کاراکتری که هر کاراکترش طبق فرمول خاصی انتخاب میشه را در sql تولید می کردم.
در بخشی از این رشته یک کاراکتر باید از بین یک گروه کاراکتر متوالی به صورت تصادفی انتخاب شود.
مثلا :
اگر StudentType برابر 5 بود به صورت تصادفی یک کاراکتر از بین کاراکترهای (B,C,D,E,F) را انتخاب کند.
در Sql Server  تابع ()Rand یک عدد تصادفی بین 0 تا 1 را تولید می کنید.
حالا سوال اینجاست که چگونه یک مقدار کاراکتری بین دو کاراکتر مشخص را پیدا کنیم.
همان طور که می دانیم هر کاراکتر داری یک کد اسکی خاص است پس با استفاده از تابع ()Ascii  می توانیم به مقدار اسکی کاراکتر ها دست پیدا کنیم.
حالا باید برای تولید یک عدد رندم حد فاصل دو عدد مشخص چه روالی را طی کنیم؟؟

برای این کار باید یک مقدار Upper و یک مقدار Lower داشته باشیم که محدوده ما را مشخص می کند: 


 DECLARE @GoalNo INT
            DECLARE @Upper INT
            DECLARE @Lower INT
  SELECT @GoalNo= ROUND(((@Upper - @Lower -1) * Rand() + @Lower

 عبارت   ROUND(((@Upper - @Lower -1) * Rand() + @Lower یک مقدار رندم را بین دو عدد مشخص می کند.
ولی هنوز کار تمام نشده است.
من باید عبارت بالا را در یک function قرار می دادم. والبته مقدار GoalNo@  یک مقدار int است ولی من یک کاراکتر می خواستم!

برای اینکه مثدار کاراکتری یک عدد را داشته باشیم از تابع ()Char برای تبدیل کردن استفاده می کنیم.
ولی اگر همین دستور را وارد تابع کنید با خطا مواجه می شود:

Invalid use of a side-effecting operator 'rand' within a function.

 برای رفع این خطا مجبور شدم یک View بسازم و در این View تابع Rand را صدا کنم  . و از این View در function  استفاده کنم:


***** View ***** 
CREATE VIEW Get_RAND
AS
SELECT RAND() AS MyRAND
GO

***** Function *****

CREATE FUNCTION [dbo].MYFunction
)
StudentType int@
  (
(RETURNS varchar(7
AS
BEGIN
   ( DECLARE @Code nvarchar(20
    
            (DECLARE @RandChar varchar(10
            DECLARE @Upper INT
            DECLARE @Lower INT
  
           ( IF (@StudentType = '19'
                BEGIN
                  (' SET @Upper = Ascii('A 
                   (' SET @Lower =  Ascii('M
                END    
            ELSE
                    IF (@StudentType = '29')
                        BEGIN
                           (' SET @Upper = Ascii('N
                            ('SET @Lower =  Ascii('P
                        END
                    
                    ELSE
                       (' IF (@StudentType = '30
                            BEGIN
                              (' SET @Upper = Ascii('Q
                               (' SET @Lower =  Ascii('R
                            END
                    
                              
        DECLARE @Rand int
       ( set @Rand = (SELECT MyRAND FROM dbo.Get_RAND
          SELECT @RandChar = CHAR(ROUND(((@Upper - @Lower -1)*@Rand +
 ((Lower),0@
  '  SELECT  @Code = 'SZ' + @RandChar + 'programmer
    RETURN @Code
END

اگر به کد بالا دقت کنید من View را صدا زدم و مقدارش را در یک متغیر ریختم.
و بعد تونستم از این مقدار در فرمولم استفاده کنم.
فرمول مقدار عددی بر می گرداند پس برای تبدیل کردن آن به مقدار کاراکتری از تابع ()Char استفاده کردم.
و در آخر هم تونستم اون رشته را تولید کنم.

موفق باشید.

۰ نظر موافقین ۲ مخالفین ۰ ۱۸ اسفند ۹۳ ، ۲۲:۴۴
سارا زکی زاده