دیروز در بخشی از کارم باید یک رشته 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 استفاده کردم.
و در آخر هم تونستم اون رشته را تولید کنم.
موفق باشید.