3

ここでのMartinSmithの回答に基づいて、2文字(AZ)、2つの数字(0-9)、2文字(AZ)で始まる10000のランダムな文字列を作成するのと非常によく似た手法を使用しようとしています。誰もが同じテクニックを使用してこれを行う方法を知っているか、それは不可能です、事前にポールに感謝します

4

2 に答える 2

1
select CHAR(RAND()*24+65) + CHAR(RAND()*24+65) + 
right('0'+CAST(CAST(RAND()*100 as int) as varchar(2)),2) + 
CHAR(RAND()*24+65) + CHAR(RAND()*24+65)

必要に応じて、RAND関数にシード値を入れたい場合があります。

私は本当にこれらの10000を手に入れると思います...

select top 10000 CHAR(RAND()*24+65) + CHAR(RAND()*24+65) + 
right('0'+CAST(CAST(RAND()*100 as int) as varchar(2)),2) + 
CHAR(RAND()*24+65) + CHAR(RAND()*24+65) 
from sys.all_objects a cross join sys.all_objects b
于 2012-10-11T20:20:42.053 に答える
1

オリジナルへのわずかな変更:

DECLARE @Numbers  TABLE
(
n INT PRIMARY KEY
);


WITH E00(N) AS (SELECT 1 UNION ALL SELECT 1),   --2
        E02(N) AS (SELECT 1 FROM E00 a, E00 b), --4
        E04(N) AS (SELECT 1 FROM E02 a, E02 b), --16
        E08(N) AS (SELECT 1 FROM E04 a, E04 b), --256
        E16(N) AS (SELECT 1 FROM E08 a, E08 b)  --65,536
INSERT INTO @Numbers
SELECT TOP 1000 ROW_NUMBER() OVER (ORDER BY (SELECT 0))
FROM E16

/* 
 1.  Build a table variable of numbers
 2.  For each row in the table (up to row 1000)
 3.  Get the top 2 numbers from the table variable
 4.  For each number, get the absolute value of the checksum of a GUID
 5.  This value will always be a positive integer
 6.  Get the remainder of that integer when divided by 26
 7.  This will always be a number between 0 and 25
 8.  If the absolute value number is divisible by 2, add 65 to the number (uppercase)
 9.  Otherwise, add 97 to the number (lowercase)
 10. Use that number as an ASCII value and get the character representation
 11. Use FOR XML PATH to convert the two characters in the subquery to a string
 12. Repeat the same logic for 2 numbers (use %9 to get two numbers between 0 and 9) 
 13. Repeat the same logic from previous steps to get two more alphabetic characters
*/

SELECT CAST((SELECT TOP 2 CHAR(CASE
                                  WHEN Abs(Checksum(Newid()))%2 = 0 THEN 65
                                  ELSE 97
                                END + Abs(Checksum(Newid()))%26)
             FROM   @Numbers n1
             WHERE  n1.n >= -n2.n 
             FOR XML PATH('')) AS CHAR(2)) + 
       CAST((SELECT TOP 2 Abs(Checksum(Newid()))%9
             FROM   @Numbers n1
             WHERE  n1.n >= -n2.n 
             FOR XML PATH('')) AS CHAR(2)) +             
       CAST((SELECT TOP 2 CHAR(CASE
                                  WHEN Abs(Checksum(Newid()))%2 = 0 THEN 65
                                  ELSE 97
                                END + Abs(Checksum(Newid()))%26)
             FROM   @Numbers n1
             WHERE  n1.n >= -n2.n /*So it gets re-evaluated for each row!*/
             FOR XML PATH('')) AS CHAR(2))
FROM   @Numbers n2  
于 2012-10-11T20:45:08.097 に答える