Во-первых, вам нужно разделить строку на отдельные строки. Затем сделайте SELECT
с ORDER BY NEWID()
для случайного сортировки. И, наконец, использовать FOR XML PATH('')
конкатенировать их обратно:
DECLARE @str VARCHAR(100) = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
;WITH E1(N) AS(-- 10^1 = 10 rows
SELECT 1 FROM(VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))t(N)
),
E2(N) AS(SELECT 1 FROM E1 a CROSS JOIN E1 b), -- 10^2 = 100 rows
E4(N) AS(SELECT 1 FROM E2 a CROSS JOIN E2 b), -- 10^4 = 10,000 rows
CteTally(N) AS(
SELECT TOP(LEN(@str)) ROW_NUMBER() OVER(ORDER BY(SELECT NULL))
FROM E4
)
SELECT (
SELECT TOP(32)
SUBSTRING(@str, N, 1)
FROM CteTally t
ORDER BY NEWID()
FOR XML PATH('')
) AS Result
ONLINE DEMO
выше является более общего генератора случайных строк. Вы можете изменить его в соответствии с вашими потребностями. Если требование не изменится, вы можете просто использовать это:
DECLARE @str VARCHAR(100) = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
;WITH E1(N) AS(-- 52 Rows
SELECT 1 FROM(VALUES
(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),
(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),
(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),
(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),
(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),
(1),(1)
)t(N)
),
CteTally(N) AS(
SELECT ROW_NUMBER() OVER(ORDER BY(SELECT NULL))
FROM E1
)
SELECT (
SELECT TOP(32)
SUBSTRING(@str, N, 1)
FROM CteTally t
ORDER BY NEWID()
FOR XML PATH('')
) AS Result
Посмотрите на функцию [ 'CRYPT_GEN_RANDOM'] (https://msdn.microsoft.com/en-us/library/cc627408.aspx), который может генерировать определенное количество случайных байт, до 8000 . SELECT CONVERT (varchar (32), CRYPT_GEN_RANDOM (16), 2) 'вернет достаточно случайную строку. Однако у него не будет символов алфавита, кроме A-F. –