টি-এসকিউএল দিয়ে এলোমেলো স্ট্রিং তৈরি করা হচ্ছে


99

আপনি যদি টি-এসকিউএল ব্যবহার করে সিউডোর্যান্ডম আলফানামুরিক স্ট্রিং তৈরি করতে চান, আপনি কীভাবে এটি করবেন? আপনি এটি থেকে ডলার চিহ্ন, ড্যাশ এবং স্ল্যাশের মতো অক্ষরগুলি কীভাবে বাদ দেবেন?

উত্তর:


41

বিশেষত পরীক্ষার জন্য এলোমেলো ডেটা তৈরি করার সময়, ডেটা এলোমেলো করে তৈরি করা খুব কার্যকর, তবে পুনরুত্পাদনযোগ্য। গোপনীয়তা হল এলোমেলো ফাংশনের জন্য স্পষ্ট বীজ ব্যবহার করা, যাতে পরীক্ষা একই বীজের সাথে আবার চালানো হয়, এটি আবার একই স্ট্রিংগুলি পুনরায় তৈরি করে। এখানে এমন কোনও ফাংশনের সরলীকৃত উদাহরণ যা প্রজননযোগ্য পদ্ধতিতে অবজেক্টের নাম উত্পন্ন করে:

alter procedure usp_generateIdentifier
    @minLen int = 1
    , @maxLen int = 256
    , @seed int output
    , @string varchar(8000) output
as
begin
    set nocount on;
    declare @length int;
    declare @alpha varchar(8000)
        , @digit varchar(8000)
        , @specials varchar(8000)
        , @first varchar(8000)
    declare @step bigint = rand(@seed) * 2147483647;

    select @alpha = 'qwertyuiopasdfghjklzxcvbnm'
        , @digit = '1234567890'
        , @specials = '_@# '
    select @first = @alpha + '_@';

    set  @seed = (rand((@seed+@step)%2147483647)*2147483647);

    select @length = @minLen + rand(@seed) * (@maxLen-@minLen)
        , @seed = (rand((@seed+@step)%2147483647)*2147483647);

    declare @dice int;
    select @dice = rand(@seed) * len(@first),
        @seed = (rand((@seed+@step)%2147483647)*2147483647);
    select @string = substring(@first, @dice, 1);

    while 0 < @length 
    begin
        select @dice = rand(@seed) * 100
            , @seed = (rand((@seed+@step)%2147483647)*2147483647);
        if (@dice < 10) -- 10% special chars
        begin
            select @dice = rand(@seed) * len(@specials)+1
                , @seed = (rand((@seed+@step)%2147483647)*2147483647);
            select @string = @string + substring(@specials, @dice, 1);
        end
        else if (@dice < 10+10) -- 10% digits
        begin
            select @dice = rand(@seed) * len(@digit)+1
                , @seed = (rand((@seed+@step)%2147483647)*2147483647);
            select @string = @string + substring(@digit, @dice, 1);
        end
        else -- rest 80% alpha
        begin
            declare @preseed int = @seed;
            select @dice = rand(@seed) * len(@alpha)+1
                , @seed = (rand((@seed+@step)%2147483647)*2147483647);

            select @string = @string + substring(@alpha, @dice, 1);
        end

        select @length = @length - 1;   
    end
end
go

পরীক্ষা চালানোর সময় কলার একটি এলোমেলো বীজ উত্পাদন করে যা পরীক্ষার সাথে এটি সংযুক্ত করে (ফলাফল টেবিলে এটি সংরক্ষণ করে), এরপরে বীজ বরাবর পাশ করে:

declare @seed int;
declare @string varchar(256);

select @seed = 1234; -- saved start seed

exec usp_generateIdentifier 
    @seed = @seed output
    , @string = @string output;
print @string;  
exec usp_generateIdentifier 
    @seed = @seed output
    , @string = @string output;
print @string;  
exec usp_generateIdentifier 
    @seed = @seed output
    , @string = @string output;
print @string;  

আপডেট 2016-02-17: মন্তব্যগুলি নমুনা দেখুন, মূল পদ্ধতিটি এলোমেলো বীজটিকে যেভাবে অগ্রসর করেছে তাতে সমস্যা ছিল। আমি কোডটি আপডেট করেছি এবং উল্লিখিত অফ-বাই-ওয়ান সমস্যাটিও ঠিক করেছি।


মনে রাখবেন যে আমার উদাহরণটিতে পুনরায় বীজ বপন করা বেশিরভাগ ক্ষেত্রে পয়েন্টটি ইলাস্ট্রেট করার জন্য। অনুশীলনে এটি পর্যায়ে একবারে আরএনজি বীজ করার পক্ষে পর্যাপ্ত, যতক্ষণ না কল সিক্যুয়েন্সটি পরে নির্ধারক হয় ward
রিমাস রুসানু

4
আমি জানি এটি পুরানো থ্রেড, তবে কোড বীজ 192804 এবং 529126 এর জন্য একই স্ট্রিংটি প্রদান করে
ডেভি

4
@ রেমুস রুসানু আমি ডেভির মন্তব্যের প্রতিক্রিয়াতে আগ্রহী
অ্যালেক্স গর্ডন

সূত্রের সাথে বীজ অগ্রসর হয় @seed = rand(@seed+1)*2147483647। 529126 মানের জন্য পরবর্তী মানটি 1230039262 এবং তারপরের পরবর্তী মান 192804। আউটপুটটি প্রথম অক্ষর দ্বারা পৃথক হওয়া উচিত, তবে এটি একের পর এক ত্রুটির কারণে নয়: SUBSTRING(..., 0, ...)সূচক 0 এর জন্য খালি স্ট্রিংটি দেয় এবং 529126 এর জন্য এটি প্রথম অক্ষরটিকে 'আড়াল' করে। @dice = rand(@seed) * len(@specials)+1সূচকগুলি 1 ভিত্তিক করতে ফিক্সটি গণনা করা।
রেমাস রুসানু

এই সমস্যাটি এ থেকে উদ্ভূত হয় যে এলোমেলো সিরিজগুলি, যখন তারা একটি সাধারণ মান আঘাত করে, তারা অভিন্নভাবে অগ্রসর হয়। যদি প্রয়োজন +1হয় তবে rand(@seed+1)এটিকে নিজেই এলোমেলো করে কেবল প্রাথমিক বীজ থেকে নির্ধারিত করে এড়ানো যায় । এইভাবে, যদিও সিরিজটি একই মানটি হিট করে তবে তারা তত্ক্ষণাত্ অন্যদিকে চলে যায়।
রেমাস রুসানু

205

একটি গাইড ব্যবহার করে

SELECT @randomString = CONVERT(varchar(255), NEWID())

খুব ছোট ...


7
+1, খুব সহজ। এটিকে প্রয়োজনীয় দৈর্ঘ্যে কাটাতে সঠিক / সাবস্ক্রাস্টিংয়ের সাথে একত্রিত করুন।
জোহানেস রুডলফ

4
আমি এটি পছন্দ - মিষ্টি এবং সহজ। যদিও এটিতে "ভবিষ্যদ্বাণী" বৈশিষ্ট্যটি নেই, তথ্যের উত্পন্নকরণের জন্য দুর্দান্ত কাজ করে।
মধুরতানওয়ানি

6
কোনও ইউইউডি কেটে কাটানোর জন্য রাইট / সাবস্ট্রাস্টিং ব্যবহার করবেন না কারণ এটি ইউইউডি উত্পন্ন হওয়ার কারণে অনন্য বা এলোমেলো হবে না!
অক্সি

4
এটি ভাল, তবে আপনি যদি এটি ব্যবহার করেন তবে নিশ্চিত হয়ে নিন যে আপনি এটি পড়েছেন: ব্লগস.এমএসএনএন / বি / ওল্ডউইউথিং / অর্চিভ / 2008 / 06 / 27 / 8659071.aspx - দ্রষ্টব্য হ'ল মাইক্রোসফ্টের বাস্তবায়ন, বিন্দুটি নির্বিশেষে অক্সি উল্লেখ করেছে, আপনি কীভাবে ইউইউডি কাটাবেন তা আপনাকে যত্নবান হওয়া দরকার।
ক্লারেন্স লিউ

7
NEWID () এর আলফা চরগুলি হেক্সিডেসিমাল, সুতরাং আপনি কেবলমাত্র এএফ পাবেন, বাকী বর্ণমালা নয়। এটি সেই অর্থেই সীমাবদ্ধ।
স্মুথ 4

52

প্রথম উদাহরণের মতো, তবে আরও নমনীয়তার সাথে:

-- min_length = 8, max_length = 12
SET @Length = RAND() * 5 + 8
-- SET @Length = RAND() * (max_length - min_length + 1) + min_length

-- define allowable character explicitly - easy to read this way an easy to 
-- omit easily confused chars like l (ell) and 1 (one) or 0 (zero) and O (oh)
SET @CharPool = 
    'abcdefghijkmnopqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ23456789.,-_!$@#%^&*'
SET @PoolLength = Len(@CharPool)

SET @LoopCount = 0
SET @RandomString = ''

WHILE (@LoopCount < @Length) BEGIN
    SELECT @RandomString = @RandomString + 
        SUBSTRING(@Charpool, CONVERT(int, RAND() * @PoolLength), 1)
    SELECT @LoopCount = @LoopCount + 1
END

আমি অন্যান্য বৈশিষ্ট্যগুলির একটি উল্লেখ করতে ভুলে গেছি যা এটি আরও নমনীয় করে তোলে। @CharPool- এ অক্ষরগুলির ব্লকগুলি পুনরাবৃত্তি করে আপনি নির্দিষ্ট অক্ষরগুলিতে ওজন বাড়িয়ে দিতে পারেন যাতে সেগুলি বেছে নেওয়ার সম্ভাবনা বেশি থাকে।


4
+1 এটি একটি ভাল রুটিন, আমি এটি সঞ্চিত পদ্ধতির অংশ হিসাবে ব্যবহার করছি।
মার্সেলো মিয়োরেলি

4
সুন্দর সমাধান। দুর্ভাগ্যক্রমে এটি কোনও উদ্যানের মধ্যে কাজ করে না। কোনও কারণে এটি এই ত্রুটিটি দেয়: "কোনও ফাংশনের মধ্যে পার্শ্ব-প্রভাবকারী অপারেটর 'র্যান্ড' ব্যবহারের অবৈধ ব্যবহার"।
rdans

12
সাবস্ক্রিং () কলটিতে এই ফাংশনটিতে একটি বাগ রয়েছে। এটি হওয়া উচিত CONVERT(int, RAND() * @PoolLength) + 1(যোগ করা +1 নোট করুন)। টি-এসকিউএল-এ সাবস্ক্র্টিং সূচী 1 দিয়ে শুরু হয়, যাতে এটি এই ফাংশনটি দাঁড়িয়ে থাকে কখনও কখনও খালি স্ট্রিং যুক্ত করে (যখন সূচক 0 হয়), এবং কখনও কখনও শেষ অক্ষরটি যুক্ত করে না @CharPool
ডানা কার্টরাইট

@ ডানা কার্টরাইট আপনি দয়া করে আমার প্রয়োজনীয়তা সম্পর্কে আমাকে সহায়তা করতে পারেন .. যদি উপরের চারপুলের মতো 10 টি বর্ণানুক্রমিক বা 12 টি বর্ণানুক্রমিক সিরিয়াল নম্বর ব্যবহার করে আমার ক্রমাগত দৈর্ঘ্যের প্রয়োজন হয় তবে কীভাবে আমরা সঞ্চিত পদ্ধতিটি পরিবর্তন করব। সামনের প্রান্তে আমি চারপুল ব্যবহার করে 100 বা 200 এর মতো উত্পন্ন সিরিয়াল সংখ্যাগুলির সরবরাহ করব। ক্রমিক সংখ্যার নূন্যতম দৈর্ঘ্য 10 এবং সর্বোচ্চ 14 ​​হবে (এটি প্যারামিটার হিসাবে সরবরাহ করা হয়)
গঙ্গিরডি

@ প্রথাপ গ্যাঙ্গিয়ার্ডি দয়া করে একটি প্রশ্ন জিজ্ঞাসা করুন, একজনের কাছে মন্তব্য করা প্রশ্নের পক্ষে সঠিক জায়গা নয়
ডানা কার্টরাইট

31

একটি সংক্ষিপ্ত স্ট্রিং ফিরে পেতে নিম্নলিখিত কোডটি ব্যবহার করুন:

SELECT SUBSTRING(CONVERT(varchar(40), NEWID()),0,9)

4
কেবলমাত্র হেক্সাডেসিমাল অক্ষরগুলি প্রদান করে: 0-9 এবং এএফ
জম্পক্সিজি

19

আপনি যদি এসকিউএল সার্ভার ২০০৮ বা তারও বেশি চলমান থাকেন তবে আপনি নতুন ক্রিপ্টোগ্রাফিক ফাংশন crypt_gen_random () ব্যবহার করতে পারেন এবং তারপরে স্ট্রিং তৈরি করতে বেস 64 এনকোডিং ব্যবহার করতে পারেন। এটি 8000 অক্ষর পর্যন্ত কাজ করবে।

declare @BinaryData varbinary(max)
    , @CharacterData varchar(max)
    , @Length int = 2048

set @BinaryData=crypt_gen_random (@Length) 

set @CharacterData=cast('' as xml).value('xs:base64Binary(sql:variable("@BinaryData"))', 'varchar(max)')

print @CharacterData

16

আমি টি-এসকিউএল-তে বিশেষজ্ঞ নই, তবে আমি ইতিমধ্যে যে সহজতম পদ্ধতি ব্যবহার করেছি তা এটি এর মতো:

select char((rand()*25 + 65))+char((rand()*25 + 65))

এটি দুটি চর তৈরি করে (এজেড, 65-90 এএসসি)।


13
select left(NEWID(),5)

এটি গাইড স্ট্রিংয়ের 5 টি বাম সর্বাধিক অক্ষর ফিরিয়ে দেবে

Example run
------------
11C89
9DB02

4
যদিও এই সমাধানটি কোনও উত্পাদন ব্যবস্থার পক্ষে ভাল না কারণ আপনি বেশ কয়েক হাজার বা তার পরেও সহজেই নকল পাবেন, তবুও কোনও ডিবাগিং বা পরীক্ষার সময় এলোমেলো স্ট্রিং পাওয়ার জন্য দ্রুত এবং সহজ উপায়ের জন্য এটি বেশ কার্যকর।
আইয়ান 1971

আমি প্রায় 500 লগইনের জন্য এলোমেলো 4 অক্ষরের পাসওয়ার্ড তৈরি করতে এটি ব্যবহার করেছি এবং এটি তার জন্য নিখুঁত কাজ করে। হ্যাঁ বড় ডেটা এবং অন্যান্য উদ্দেশ্যে আরও অক্ষর ব্যবহার করুন।
হামাদ খান

4
NEWID () নিরাপদ পাসওয়ার্ডগুলির জন্য যথেষ্ট এলোমেলো হিসাবে বিবেচিত হয় না, সুতরাং আপনার প্রয়োজনীয়তার উপর নির্ভর করে আপনার যত্নবান হওয়া দরকার। 5 টি অক্ষরের সাথে আপনি প্রায় 1500 টি রেকর্ড পরে সংঘর্ষ পান। 4 টি অক্ষরের সাথে আপনি আমার পরীক্ষার 55-800 রেকর্ড থেকে যে কোনও জায়গায় সংঘর্ষ পান।
Ian1971

অস্থায়ী পাসওয়ার্ডের জন্য @ আইয়ান ১৯71১, এটি এখনও ঠিক আছে। বলি আমি আপনাকে এটিএম কার্ডের জন্য 4 টি লেটার পিন দেব। একই পিনটি অন্য 800 তম ব্যবহারকারীকেও বলতে দেওয়া জারি করা হতে পারে তবে আপনি নিজের পাসওয়ার্ড দিয়ে তার কার্ডটি ব্যবহার করবেন এমন সম্ভাবনা খুব কম। এটি প্রায় একটি এলোমেলো সংখ্যা যা অস্থায়ী অ্যাক্সেসের জন্য ঠিক।
হামাদ খান

ডান দিক থেকে নেওয়া যাক, ইউইউডি-তে প্রথম আটটি চর হাইফেনের পরে আছে তবে 12 এর পরে ডান দিক থেকে হাইফেন রয়েছে। সুতরাং, ডান (NEWID (), 10)
পি সতীশ প্যাট্রো

6

এখানে একটি এলোমেলো আলফা সংখ্যার জেনারেটর

print left(replace(newid(),'-',''),@length) //--@length is the length of random Num.

কেবলমাত্র হেক্সাডেসিমাল অক্ষরগুলি প্রদান করে: 0-9 এবং এএফ
জম্পক্সিজি

6

একটি এলোমেলো চিঠির জন্য, আপনি এটি ব্যবহার করতে পারেন:

select substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ',
                 (abs(checksum(newid())) % 26)+1, 1)

newid()বনাম ব্যবহারের মধ্যে একটি গুরুত্বপূর্ণ পার্থক্য rand()হ'ল আপনি যদি একাধিক সারি ফিরিয়ে দেন তবে newid()প্রতিটি সারির জন্য পৃথক করে গণনা করা হয়, যখন rand()পুরো ক্যোয়ারির জন্য একবার গণনা করা হয়।


4

এটি আমার জন্য কাজ করেছে: একটি আইডির জন্য আমার কেবল তিনটি এলোমেলো অক্ষর তৈরি করতে হবে তবে এটি 15 বা তার বেশি দৈর্ঘ্যের জন্য কাজ করতে পারে।

declare @DesiredLength as int = 3;
select substring(replace(newID(),'-',''),cast(RAND()*(31-@DesiredLength) as int),@DesiredLength);

কেবলমাত্র হেক্সাডেসিমাল অক্ষরগুলি প্রদান করে: 0-9 এবং এএফ
জম্পক্সিজি

হ্যাঁ, আমি আপনার সঠিক অনুমান। আপনি অক্ষর> "এফ" না পেয়ে এটি সত্যই "বর্ণমালা" নয় "
ব্রায়ান

4

অনেক ভাল উত্তর আছে কিন্তু এখনও অবধি এগুলির কোনওটিই কাস্টমাইজযোগ্য চরিত্রের পুলের অনুমতি দেয় না এবং কলামের জন্য একটি ডিফল্ট মান হিসাবে কাজ করে। আমি এই জাতীয় কিছু করতে সক্ষম হতে চাই:

alter table MY_TABLE add MY_COLUMN char(20) not null
  default dbo.GenerateToken(crypt_gen_random(20))

তাই আমি এই নিয়ে এসেছি। হার্ড কোডিং 32 নম্বর থেকে সাবধান থাকুন যদি আপনি এটিকে পরিবর্তন করেন।

-- Converts a varbinary of length N into a varchar of length N.
-- Recommend passing in the result of CRYPT_GEN_RANDOM(N).
create function GenerateToken(@randomBytes varbinary(max))
returns varchar(max) as begin

-- Limit to 32 chars to get an even distribution (because 32 divides 256) with easy math.
declare @allowedChars char(32);
set @allowedChars = 'abcdefghijklmnopqrstuvwxyz012345';

declare @oneByte tinyint;
declare @oneChar char(1);
declare @index int;
declare @token varchar(max);

set @index = 0;
set @token = '';

while @index < datalength(@randomBytes)
begin
    -- Get next byte, use it to index into @allowedChars, and append to @token.
    -- Note: substring is 1-based.
    set @index = @index + 1;
    select @oneByte = convert(tinyint, substring(@randomBytes, @index, 1));
    select @oneChar = substring(@allowedChars, 1 + (@oneByte % 32), 1); -- 32 is the number of @allowedChars
    select @token = @token + @oneChar;
end

return @token;

end

2

আমি বুঝতে পারি যে এটি অনেক সূক্ষ্ম উত্তর সহ একটি পুরানো প্রশ্ন। তবে যখন আমি এটি পেয়েছি তখন আমি সাইদ হাসানির টেকনেটে একটি সাম্প্রতিক নিবন্ধটিও পেয়েছি

টি-এসকিউএল: র্যান্ডম পাসওয়ার্ড কীভাবে জেনারেট করা যায়

যদিও সমাধানটি পাসওয়ার্ডগুলিতে ফোকাস করে এটি সাধারণ ক্ষেত্রে প্রযোজ্য। সাeদ একটি সমাধানে পৌঁছানোর জন্য বিভিন্ন বিবেচনার মাধ্যমে কাজ করে। এটা খুব শিক্ষণীয়।

নিবন্ধটি তৈরি করে সমস্ত কোড ব্লক সমন্বিত একটি স্ক্রিপ্ট টেকনেট গ্যালারির মাধ্যমে পৃথকভাবে উপলভ্য , তবে আমি অবশ্যই নিবন্ধটি থেকে শুরু করব।


1

আমি এই পদ্ধতিটি ব্যবহার করি যা আমি বিকাশ করেছিলাম কেবলমাত্র চ্যাপ্টারের জন্য আপনি ইনপুট ভেরিয়েবলগুলিতে প্রদর্শন করতে সক্ষম হতে চান, আপনি দৈর্ঘ্যটিও সংজ্ঞায়িত করতে পারেন। আশা করি এই ফর্ম্যাটগুলি ভাল, আমি ওভারফ্লো স্ট্যাক করতে নতুন।

IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND object_id = OBJECT_ID(N'GenerateARandomString'))
DROP PROCEDURE GenerateARandomString
GO

CREATE PROCEDURE GenerateARandomString
(
     @DESIREDLENGTH         INTEGER = 100,                  
     @NUMBERS               VARCHAR(50) 
        = '0123456789',     
     @ALPHABET              VARCHAR(100) 
        ='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',
     @SPECIALS              VARCHAR(50) 
        = '_=+-$£%^&*()"!@~#:', 
     @RANDOMSTRING          VARCHAR(8000)   OUT 

)

AS

BEGIN
    -- Author David Riley
    -- Version 1.0 
    -- You could alter to one big string .e.e numebrs , alpha special etc
    -- added for more felxibility in case I want to extend i.e put logic  in for 3 numbers, 2 pecials 3 numbers etc
    -- for now just randomly pick one of them

    DECLARE @SWAP                   VARCHAR(8000);      -- Will be used as a tempoary buffer 
    DECLARE @SELECTOR               INTEGER = 0;

    DECLARE @CURRENTLENGHT          INTEGER = 0;
    WHILE @CURRENTLENGHT < @DESIREDLENGTH
    BEGIN

        -- Do we want a number, special character or Alphabet Randonly decide?
        SET @SELECTOR  = CAST(ABS(CHECKSUM(NEWID())) % 3 AS INTEGER);   -- Always three 1 number , 2 alphaBET , 3 special;
        IF @SELECTOR = 0
        BEGIN
            SET @SELECTOR = 3
        END;

        -- SET SWAP VARIABLE AS DESIRED
        SELECT @SWAP = CASE WHEN @SELECTOR = 1 THEN @NUMBERS WHEN @SELECTOR = 2 THEN @ALPHABET ELSE @SPECIALS END;

        -- MAKE THE SELECTION
        SET @SELECTOR  = CAST(ABS(CHECKSUM(NEWID())) % LEN(@SWAP) AS INTEGER);
        IF @SELECTOR = 0
        BEGIN
            SET @SELECTOR = LEN(@SWAP)
        END;

        SET @RANDOMSTRING = ISNULL(@RANDOMSTRING,'') + SUBSTRING(@SWAP,@SELECTOR,1);
        SET @CURRENTLENGHT = LEN(@RANDOMSTRING);
    END;

END;

GO

DECLARE @RANDOMSTRING VARCHAR(8000)

EXEC GenerateARandomString @RANDOMSTRING = @RANDOMSTRING OUT

SELECT @RANDOMSTRING

1

কখনও কখনও আমাদের প্রচুর এলোমেলো জিনিস দরকার: প্রেম, দয়া, ছুটি ইত্যাদি the আমি কয়েক বছর ধরে কয়েকটা এলোমেলো জেনারেটর সংগ্রহ করেছি এবং এগুলি পিনাল ডেভের এবং আমি একবার খুঁজে পেয়েছি এমন স্ট্যাকওভারফ্লো উত্তর। নীচে রেফারেন্স।

--Adapted from Pinal Dave; http://blog.sqlauthority.com/2007/04/29/sql-server-random-number-generator-script-sql-query/
SELECT 
    ABS( CAST( NEWID() AS BINARY( 6)) %1000) + 1 AS RandomInt
    , CAST( (ABS( CAST( NEWID() AS BINARY( 6)) %1000) + 1)/7.0123 AS NUMERIC( 15,4)) AS RandomNumeric
    , DATEADD( DAY, -1*(ABS( CAST( NEWID() AS BINARY( 6)) %1000) + 1), GETDATE()) AS RandomDate
    --This line from http://stackoverflow.com/questions/15038311/sql-password-generator-8-characters-upper-and-lower-and-include-a-number
    , CAST((ABS(CHECKSUM(NEWID()))%10) AS VARCHAR(1)) + CHAR(ASCII('a')+(ABS(CHECKSUM(NEWID()))%25)) + CHAR(ASCII('A')+(ABS(CHECKSUM(NEWID()))%25)) + LEFT(NEWID(),5) AS RandomChar
    , ABS(CHECKSUM(NEWID()))%50000+1 AS RandomID

4
সহজ র্যান্ডম জেনারেটর সংগ্রহ পোস্ট করার জন্য ধন্যবাদ
iiminov

1

এখানে আজকে একটি নিয়ে এসেছি (কারণ আমি বিদ্যমান উত্তরগুলির কোনওটিই পছন্দ করি না)।

এই একটি এলোমেলো স্ট্রিংয়ের একটি টেম্প টেবিল তৈরি করে, এর ভিত্তিতে তৈরি newid() , তবে এটি একটি কাস্টম চরিত্র সেটকে সমর্থন করে (কেবলমাত্র 0-9 এবং এএফএফের চেয়ে বেশি), কাস্টম দৈর্ঘ্য (255 অবধি, সীমাটি হার্ড-কোডড থাকে তবে তা হতে পারে) পরিবর্তিত), এবং এলোমেলো রেকর্ডগুলির একটি কাস্টম নম্বর।

সোর্স কোডটি এখানে রয়েছে (আশা করি মন্তব্যগুলি সহায়তা করবে):

/**
 * First, we're going to define the random parameters for this
 * snippet. Changing these variables will alter the entire
 * outcome of this script. Try not to break everything.
 *
 * @var {int}       count    The number of random values to generate.
 * @var {int}       length   The length of each random value.
 * @var {char(62)}  charset  The characters that may appear within a random value.
 */

-- Define the parameters
declare @count int = 10
declare @length int = 60
declare @charset char(62) = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'

/**
 * We're going to define our random table to be twice the maximum
 * length (255 * 2 = 510). It's twice because we will be using
 * the newid() method, which produces hex guids. More later.
 */

-- Create the random table
declare @random table (
    value nvarchar(510)
)

/**
 * We'll use two characters from newid() to make one character in
 * the random value. Each newid() provides us 32 hex characters,
 * so we'll have to make multiple calls depending on length.
 */

-- Determine how many "newid()" calls we'll need per random value
declare @iterations int = ceiling(@length * 2 / 32.0)

/**
 * Before we start making multiple calls to "newid", we need to
 * start with an initial value. Since we know that we need at
 * least one call, we will go ahead and satisfy the count.
 */

-- Iterate up to the count
declare @i int = 0 while @i < @count begin set @i = @i + 1

    -- Insert a new set of 32 hex characters for each record, limiting to @length * 2
    insert into @random
        select substring(replace(newid(), '-', ''), 1, @length * 2)

end

-- Now fill the remaining the remaining length using a series of update clauses
set @i = 0 while @i < @iterations begin set @i = @i + 1

    -- Append to the original value, limit @length * 2
    update @random
        set value = substring(value + replace(newid(), '-', ''), 1, @length * 2)

end

/**
 * Now that we have our base random values, we can convert them
 * into the final random values. We'll do this by taking two
 * hex characters, and mapping then to one charset value.
 */

-- Convert the base random values to charset random values
set @i = 0 while @i < @length begin set @i = @i + 1

    /**
     * Explaining what's actually going on here is a bit complex. I'll
     * do my best to break it down step by step. Hopefully you'll be
     * able to follow along. If not, then wise up and come back.
     */

    -- Perform the update
    update @random
        set value =

            /**
             * Everything we're doing here is in a loop. The @i variable marks
             * what character of the final result we're assigning. We will
             * start off by taking everything we've already done first.
             */

            -- Take the part of the string up to the current index
            substring(value, 1, @i - 1) +

            /**
             * Now we're going to convert the two hex values after the index,
             * and convert them to a single charset value. We can do this
             * with a bit of math and conversions, so function away!
             */

            -- Replace the current two hex values with one charset value
            substring(@charset, convert(int, convert(varbinary(1), substring(value, @i, 2), 2)) * (len(@charset) - 1) / 255 + 1, 1) +
    --  (1) -------------------------------------------------------^^^^^^^^^^^^^^^^^^^^^^^-----------------------------------------
    --  (2) ---------------------------------^^^^^^^^^^^^^^^^^^^^^^11111111111111111111111^^^^-------------------------------------
    --  (3) --------------------^^^^^^^^^^^^^2222222222222222222222222222222222222222222222222^------------------------------------
    --  (4) --------------------333333333333333333333333333333333333333333333333333333333333333---^^^^^^^^^^^^^^^^^^^^^^^^^--------
    --  (5) --------------------333333333333333333333333333333333333333333333333333333333333333^^^4444444444444444444444444--------
    --  (6) --------------------5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555^^^^----
    --  (7) ^^^^^^^^^^^^^^^^^^^^66666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666^^^^

            /**
             * (1) - Determine the two hex characters that we'll be converting (ex: 0F, AB, 3C, etc.)
             * (2) - Convert those two hex characters to a a proper hexadecimal (ex: 0x0F, 0xAB, 0x3C, etc.)
             * (3) - Convert the hexadecimals to integers (ex: 15, 171, 60)
             * (4) - Determine the conversion ratio between the length of @charset and the range of hexadecimals (255)
             * (5) - Multiply the integer from (3) with the conversion ratio from (4) to get a value between 0 and (len(@charset) - 1)
             * (6) - Add 1 to the offset from (5) to get a value between 1 and len(@charset), since strings start at 1 in SQL
             * (7) - Use the offset from (6) and grab a single character from @subset
             */

            /**
             * All that is left is to add in everything we have left to do.
             * We will eventually process the entire string, but we will
             * take things one step at a time. Round and round we go!
             */

            -- Append everything we have left to do
            substring(value, 2 + @i, len(value))

end

-- Select the results
select value
from @random

এটি কোনও সঞ্চিত প্রক্রিয়া নয়, তবে একে একে রূপান্তর করা এত কঠিন হবে না। এটি ভয়াবহভাবে ধীরগতিতেও নয় (আমার দৈর্ঘ্যের 60 টি ফলাফলের জন্য আমাকে 0.3 ডলার সময় লেগেছে, যা আমি ব্যক্তিগতভাবে প্রয়োজন তার চেয়ে বেশি), যা আমি করছি সমস্ত স্ট্রিং মিউটেশন থেকেই আমার প্রাথমিক উদ্বেগ।

এখানে প্রধান গ্রহণযোগ্যতা হ'ল আমি নিজের র্যান্ডম নম্বর জেনারেটর তৈরি করার চেষ্টা করছি না, এবং আমার চরিত্রের সেটটি সীমাবদ্ধ নয়। আমি কেবল এসকিউএল-এর র্যান্ডম জেনারেটরটি ব্যবহার করছি (আমি জানি সেখানে রয়েছে rand(), তবে এটি টেবিলের ফলাফলের জন্য দুর্দান্ত নয়)। আশা করা যায় যে এই পদ্ধতির মাত্রাতিরিক্ত সরল (অর্থাত্ কেবলমাত্র newid()) এবং অতিরিক্ত জটিল (অর্থাত্ কাস্টম এলোমেলো সংখ্যা নম্বর অ্যালগোরিদম) থেকে এখানে দুটি ধরণের উত্তরকে বিয়ে করে ।

এটিও সংক্ষিপ্ত (মন্তব্যসমূহের বিয়োগ মন্তব্য), এবং সহজেই বুঝতে পারবেন (কমপক্ষে আমার জন্য) যা আমার বইয়ের সর্বদা একটি প্লাস।

তবে, এই পদ্ধতিটি বীজযুক্ত করা যায় না, সুতরাং এটি প্রতিটি সময় সত্যই এলোমেলো হতে চলেছে, এবং আপনি নির্ভরযোগ্যতার কোনও উপায়ে একই সেট ডেটাটির অনুলিপি করতে পারবেন না। ওপি প্রয়োজনীয়তা হিসাবে এটি তালিকাভুক্ত করেনি, তবে আমি জানি যে কিছু লোক এই ধরণের জিনিসটির সন্ধান করে।

আমি জানি আমি এখানে পার্টিতে দেরি করেছি, তবে আশা করি কেউ এই কাজে লাগবে।


1

এটি বেস 64 রেঞ্জের (আপার, নিম্ন, সংখ্যা, + এবং /) দৈর্ঘ্যে একটি স্ট্রিং 96 টি অক্ষর তৈরি করবে will 3 "NEWID ()" যুক্ত করার সাথে বেইজ 64 প্যাডিং (=) ছাড়াই দৈর্ঘ্য 32 টি বৃদ্ধি পাবে।

    SELECT 
        CAST(
            CONVERT(NVARCHAR(MAX),
                CONVERT(VARBINARY(8), NEWID())
                +CONVERT(VARBINARY(8), NEWID())
                +CONVERT(VARBINARY(8), NEWID())
                +CONVERT(VARBINARY(8), NEWID())
                +CONVERT(VARBINARY(8), NEWID())
                +CONVERT(VARBINARY(8), NEWID())
                +CONVERT(VARBINARY(8), NEWID())
                +CONVERT(VARBINARY(8), NEWID())
                +CONVERT(VARBINARY(8), NEWID())
            ,2) 
        AS XML).value('xs:base64Binary(xs:hexBinary(.))', 'VARCHAR(MAX)') AS StringValue

আপনি যদি এটি কোনও সেটটিতে প্রয়োগ করছেন তবে সেই সেটটি থেকে এমন কিছু প্রবর্তন করার বিষয়টি নিশ্চিত করুন যাতে NEWID () পুনরুদ্ধার হয়, অন্যথায় আপনি প্রতিবার একই মান পাবেন:

  SELECT 
    U.UserName
    , LEFT(PseudoRandom.StringValue, LEN(U.Pwd)) AS FauxPwd
  FROM Users U
    CROSS APPLY (
        SELECT 
            CAST(
                CONVERT(NVARCHAR(MAX),
                    CONVERT(VARBINARY(8), NEWID())
                    +CONVERT(VARBINARY(8), NEWID())
                    +CONVERT(VARBINARY(8), NEWID())
                    +CONVERT(VARBINARY(8), NEWID())
                    +CONVERT(VARBINARY(8), NEWID())
                    +CONVERT(VARBINARY(8), NEWID())
                    +CONVERT(VARBINARY(8), NEWID())
                    +CONVERT(VARBINARY(8), NEWID())
                    +CONVERT(VARBINARY(8), NEWID())
                    +CONVERT(VARBINARY(8), NEWID())
                    +CONVERT(VARBINARY(8), U.UserID)  -- Causes a recomute of all NEWID() calls
                ,2) 
            AS XML).value('xs:base64Binary(xs:hexBinary(.))', 'VARCHAR(MAX)') AS StringValue
    ) PseudoRandom

1

এসকিউএল সার্ভার ২০১ 2016 এবং তার পরে, প্রদত্ত বাইট দৈর্ঘ্যের ক্রিপ্টোগ্রাফিকভাবে এলোমেলো স্ট্রিং উত্পন্ন করার জন্য এখানে একটি সত্যই সহজ এবং তুলনামূলক দক্ষ অভিব্যক্তি:

--Generates 36 bytes (48 characters) of base64 encoded random data
select r from OpenJson((select Crypt_Gen_Random(36) r for json path)) 
  with (r varchar(max))

নোট করুন যে বাইট দৈর্ঘ্য এনকোড করা আকারের মতো নয়; রূপান্তর করতে এই নিবন্ধ থেকে নিম্নলিখিতটি ব্যবহার করুন :

Bytes = 3 * (LengthInCharacters / 4) - Padding

0

আমি প্রথমে এই ব্লগ পোস্টটি জুড়ে এসেছি , তারপরে এটির জন্য নিম্নোক্ত সঞ্চিত প্রক্রিয়াটি নিয়ে এসেছি যা আমি একটি বর্তমান প্রকল্পে ব্যবহার করছি (অদ্ভুত বিন্যাসের জন্য দুঃখিত):

CREATE PROCEDURE [dbo].[SpGenerateRandomString]
@sLength tinyint = 10,
@randomString varchar(50) OUTPUT
AS
BEGIN
SET NOCOUNT ON
DECLARE @counter tinyint
DECLARE @nextChar char(1)
SET @counter = 1
SET @randomString = ”

WHILE @counter <= @sLength
BEGIN
SELECT @nextChar = CHAR(48 + CONVERT(INT, (122-48+1)*RAND()))

IF ASCII(@nextChar) not in (58,59,60,61,62,63,64,91,92,93,94,95,96)
BEGIN
SELECT @randomString = @randomString + @nextChar
SET @counter = @counter + 1
END
END
END

0

আমি এসকিউএল 2000 এ এমন একটি টেবিল তৈরি করেছিলাম যাতে আমি ব্যবহার করতে চাইলে অক্ষরগুলি তৈরি করা হয়েছিল, এমন একটি ভিউ তৈরি করে যা সেই টেবিল থেকে নবীড () দ্বারা অর্ডার করে অক্ষর নির্বাচন করে এবং তারপরে সেই দৃশ্য থেকে শীর্ষ 1 অক্ষর নির্বাচন করে।

CREATE VIEW dbo.vwCodeCharRandom
AS
SELECT TOP 100 PERCENT 
    CodeChar
FROM dbo.tblCharacter
ORDER BY 
    NEWID()

...

SELECT TOP 1 CodeChar FROM dbo.vwCodeCharRandom

তারপরে আপনি কেবল ভিউ থেকে অক্ষরগুলি টানতে পারেন এবং প্রয়োজন অনুসারে এগুলিকে সংযুক্ত করতে পারেন।

সম্পাদনা: স্টিফানের প্রতিক্রিয়া দ্বারা অনুপ্রাণিত ...

select top 1 RandomChar from tblRandomCharacters order by newid()

দেখার প্রয়োজন নেই (আসলে আমি কেন এটি করেছি তা নিশ্চিত নয় - বেশ কয়েক বছর আগের কোডটি)। আপনি এখনও সারণিতে যে অক্ষরগুলি ব্যবহার করতে চান তা নির্দিষ্ট করতে পারেন।


0

নতুন আইডির উপর ভিত্তি করে এখানে কিছু।

with list as 
(
    select 1 as id,newid() as val
         union all
    select id + 1,NEWID()
    from    list   
    where   id + 1 < 10
) 
select ID,val from list
option (maxrecursion 0)

কেবলমাত্র হেক্সাডেসিমাল অক্ষরগুলি প্রদান করে: 0-9 এবং এএফ
জম্পক্সিজি

0

আমি ভেবেছিলাম আমি ভাগ করে নেব, বা সম্প্রদায়কে ফিরিয়ে দেব ... এটি ASCII ভিত্তিক, এবং সমাধানটি নিখুঁত নয় তবে এটি বেশ ভালভাবে কাজ করে। উপভোগ করুন, গোরান বি।

/* 
-- predictable masking of ascii chars within a given decimal range
-- purpose: 
--    i needed an alternative to hashing alg. or uniqueidentifier functions
--    because i wanted to be able to revert to original char set if possible ("if", the operative word)
-- notes: wrap below in a scalar function if desired (i.e. recommended)
-- by goran biljetina (2014-02-25)
*/

declare 
@length int
,@position int
,@maskedString varchar(500)
,@inpString varchar(500)
,@offsetAsciiUp1 smallint
,@offsetAsciiDown1 smallint
,@ipOffset smallint
,@asciiHiBound smallint
,@asciiLoBound smallint


set @ipOffset=null
set @offsetAsciiUp1=1
set @offsetAsciiDown1=-1
set @asciiHiBound=126 --> up to and NOT including
set @asciiLoBound=31 --> up from and NOT including

SET @inpString = '{"config":"some string value", "boolAttr": true}'
SET @length = LEN(@inpString)

SET @position = 1
SET @maskedString = ''

--> MASK:
---------
WHILE (@position < @length+1) BEGIN
    SELECT @maskedString = @maskedString + 
    ISNULL(
        CASE 
        WHEN ASCII(SUBSTRING(@inpString,@position,1))>@asciiLoBound AND ASCII(SUBSTRING(@inpString,@position,1))<@asciiHiBound
         THEN
            CHAR(ASCII(SUBSTRING(@inpString,@position,1))+
            (case when @ipOffset is null then
            case when ASCII(SUBSTRING(@inpString,@position,1))%2=0 then @offsetAsciiUp1 else @offsetAsciiDown1 end
            else @ipOffset end))
        WHEN ASCII(SUBSTRING(@inpString,@position,1))<=@asciiLoBound
         THEN '('+CONVERT(varchar,ASCII(SUBSTRING(@Inpstring,@position,1))+1000)+')' --> wrap for decode
        WHEN ASCII(SUBSTRING(@inpString,@position,1))>=@asciiHiBound
         THEN '('+CONVERT(varchar,ASCII(SUBSTRING(@inpString,@position,1))+1000)+')' --> wrap for decode
        END
        ,'')
    SELECT @position = @position + 1
END

select @MaskedString


SET @inpString = @maskedString
SET @length = LEN(@inpString)

SET @position = 1
SET @maskedString = ''

--> UNMASK (Limited to within ascii lo-hi bound):
-------------------------------------------------
WHILE (@position < @length+1) BEGIN
    SELECT @maskedString = @maskedString + 
    ISNULL(
        CASE 
        WHEN ASCII(SUBSTRING(@inpString,@position,1))>@asciiLoBound AND ASCII(SUBSTRING(@inpString,@position,1))<@asciiHiBound
         THEN
            CHAR(ASCII(SUBSTRING(@inpString,@position,1))+
            (case when @ipOffset is null then
            case when ASCII(SUBSTRING(@inpString,@position,1))%2=1 then @offsetAsciiDown1 else @offsetAsciiUp1 end
            else @ipOffset*(-1) end))
        ELSE ''
        END
        ,'')
    SELECT @position = @position + 1
END

select @maskedString

আমি বুঝতে পারি যে আমার সমাধানটি এলোমেলো চর প্রজন্ম নয়, বরং তারের অনুমানযোগ্য অবকাশ ... :)
গোরান বি।

0

এটি অন্য উত্তরের মতো বীজের সাথে র‌্যান্ড ব্যবহার করে তবে প্রতিটি কলে বীজ সরবরাহ করা প্রয়োজন হয় না। এটি প্রথম কলটিতে সরবরাহ করা যথেষ্ট।

এটি আমার সংশোধিত কোড।

IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND object_id = OBJECT_ID(N'usp_generateIdentifier'))
DROP PROCEDURE usp_generateIdentifier
GO

create procedure usp_generateIdentifier
    @minLen int = 1
    , @maxLen int = 256
    , @seed int output
    , @string varchar(8000) output
as
begin
    set nocount on;
    declare @length int;
    declare @alpha varchar(8000)
        , @digit varchar(8000)
        , @specials varchar(8000)
        , @first varchar(8000)

    select @alpha = 'qwertyuiopasdfghjklzxcvbnm'
        , @digit = '1234567890'
        , @specials = '_@#$&'
    select @first = @alpha + '_@';

    -- Establish our rand seed and store a new seed for next time
    set  @seed = (rand(@seed)*2147483647);

    select @length = @minLen + rand() * (@maxLen-@minLen);
    --print @length

    declare @dice int;
    select @dice = rand() * len(@first);
    select @string = substring(@first, @dice, 1);

    while 0 < @length 
    begin
        select @dice = rand() * 100;
        if (@dice < 10) -- 10% special chars
        begin
            select @dice = rand() * len(@specials)+1;
            select @string = @string + substring(@specials, @dice, 1);
        end
        else if (@dice < 10+10) -- 10% digits
        begin
            select @dice = rand() * len(@digit)+1;
            select @string = @string + substring(@digit, @dice, 1);
        end
        else -- rest 80% alpha
        begin
            select @dice = rand() * len(@alpha)+1;

            select @string = @string + substring(@alpha, @dice, 1);
        end

        select @length = @length - 1;   
    end
end
go

0

ইন SQL সার্ভার 2012+ আমরা কিছু (জি) UIDs এর বাইনেরিতে কনক্যাটেনেট পারে এবং তারপর একটি না করুন Base64- ফলাফলে রূপান্তর।

SELECT 
    textLen.textLen
,   left((
        select  CAST(newid() as varbinary(max)) + CAST(newid() as varbinary(max)) 
        where   textLen.textLen is not null /*force evaluation for each outer query row*/ 
        FOR XML PATH(''), BINARY BASE64
    ),textLen.textLen)   as  randomText
FROM ( values (2),(4),(48) ) as textLen(textLen)    --define lengths here
;

আপনার যদি দীর্ঘতর স্ট্রিংগুলির প্রয়োজন হয় (বা =ফলস্বরূপ আপনি অক্ষরগুলি দেখতে পান) আপনাকে + CAST(newid() as varbinary(max))সাব-সিলেক্টে আরও যুক্ত করতে হবে।


0

তাই আমি উপরের উত্তরগুলি অনেক পছন্দ করেছি, তবে আমি এমন কিছু সন্ধান করছিলাম যা প্রকৃতিতে কিছুটা এলোমেলো। আমি স্পষ্টভাবে বাদ দেওয়া অক্ষরগুলি কল করার একটি উপায়ও চেয়েছিলাম। নীচে আমার মতামতটি এমন একটি ভিউ ব্যবহার করে সমাধান করছে যা CRYPT_GEN_RANDOMক্রিপ্টোগ্রাফিক র্যান্ডম নম্বর পেতে কল করে । আমার উদাহরণস্বরূপ, আমি কেবল 8 বাইটের একটি এলোমেলো সংখ্যা বেছে নিয়েছি। দয়া করে মনে রাখবেন, আপনি এই আকারটি বাড়িয়ে তুলতে পারেন এবং ফাংশনের বীজ পরামিতিটি আপনি চাইলে ব্যবহার করতে পারেন। এখানে ডকুমেন্টেশনের লিঙ্কটি রয়েছে: https://docs.microsoft.com/en-us/sql/t-sql/function/crypt-gen-random-transact-sql

CREATE VIEW [dbo].[VW_CRYPT_GEN_RANDOM_8]
AS
SELECT CRYPT_GEN_RANDOM(8) as [value];

ভিউ তৈরির কারণ হ'ল কারণ CRYPT_GEN_RANDOMকোনও ফাংশন থেকে সরাসরি কল করা যায় না।

সেখান থেকে, আমি একটি স্কেলার ফাংশন তৈরি করেছি যা একটি দৈর্ঘ্য এবং একটি স্ট্রিং প্যারামিটার গ্রহণ করে যা বর্জনিত অক্ষরের একটি কমা বিস্মৃত স্ট্রিং থাকতে পারে।

CREATE FUNCTION [dbo].[fn_GenerateRandomString]
( 
    @length INT,
    @excludedCharacters VARCHAR(200) --Comma delimited string of excluded characters
)
RETURNS VARCHAR(Max)
BEGIN
    DECLARE @returnValue VARCHAR(Max) = ''
        , @asciiValue INT
        , @currentCharacter CHAR;

    --Optional concept, you can add default excluded characters
    SET @excludedCharacters = CONCAT(@excludedCharacters,',^,*,(,),-,_,=,+,[,{,],},\,|,;,:,'',",<,.,>,/,`,~');

    --Table of excluded characters
    DECLARE @excludedCharactersTable table([asciiValue] INT);

    --Insert comma
    INSERT INTO @excludedCharactersTable SELECT 44;

    --Stores the ascii value of the excluded characters in the table
    INSERT INTO @excludedCharactersTable
    SELECT ASCII(TRIM(value))
    FROM STRING_SPLIT(@excludedCharacters, ',')
    WHERE LEN(TRIM(value)) = 1;

    --Keep looping until the return string is filled
    WHILE(LEN(@returnValue) < @length)
    BEGIN
        --Get a truly random integer values from 33-126
        SET @asciiValue = (SELECT TOP 1 (ABS(CONVERT(INT, [value])) % 94) + 33 FROM [dbo].[VW_CRYPT_GEN_RANDOM_8]);

        --If the random integer value is not in the excluded characters table then append to the return string
        IF(NOT EXISTS(SELECT * 
                        FROM @excludedCharactersTable 
                        WHERE [asciiValue] = @asciiValue))
        BEGIN
            SET @returnValue = @returnValue + CHAR(@asciiValue);
        END
    END

    RETURN(@returnValue);
END

ফাংশনটি কীভাবে কল করা যায় তার উদাহরণ নীচে।

SELECT [dbo].[fn_GenerateRandomString](8,'!,@,#,$,%,&,?');

Ers চিয়ার্স


0

এটি খুব সহজভাবে ব্যবহার করুন এবং উপভোগ করুন।

CREATE VIEW [dbo].[vwGetNewId]
AS
SELECT        NEWID() AS Id

Creat FUNCTION [dbo].[fnGenerateRandomString](@length INT = 8)
RETURNS NVARCHAR(MAX)
AS
BEGIN

DECLARE @result CHAR(2000);

DECLARE @String VARCHAR(2000);

SET @String = 'abcdefghijklmnopqrstuvwxyz' + --lower letters
'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + --upper letters
'1234567890'; --number characters

SELECT @result =
(
    SELECT TOP (@length)
           SUBSTRING(@String, 1 + number, 1) AS [text()]
    FROM master..spt_values
    WHERE number < DATALENGTH(@String)
          AND type = 'P'
    ORDER BY
(
    SELECT TOP 1 Id FROM dbo.vwGetNewId
)   --instead of using newid()
    FOR XML PATH('')
);

RETURN @result;

END;

0

এই নিবন্ধটিতে বিভিন্ন সহায়ক প্রতিক্রিয়াগুলির উপর ভিত্তি করে আমি আমার পছন্দ মতো দুটি বিকল্পের সংমিশ্রণে পৌঁছেছি।

DECLARE @UserId BIGINT = 12345 -- a uniqueId in my system
SELECT LOWER(REPLACE(NEWID(),'-','')) + CONVERT(VARCHAR, @UserId)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.