Sql 关于要求,您应该要求OP提供适当的样本数据,以便我们在回答中使用。尽管如此,我的方法的主要好处是,您不必对记录进行随机排序,因为它们已经是随机的了。如果需要的话?我不知道,你为什么不试试呢?因为事实上,您正在比较两种方法/建议/答案,它们做的事情并不相同(
Sql 关于要求,您应该要求OP提供适当的样本数据,以便我们在回答中使用。尽管如此,我的方法的主要好处是,您不必对记录进行随机排序,因为它们已经是随机的了。如果需要的话?我不知道,你为什么不试试呢?因为事实上,您正在比较两种方法/建议/答案,它们做的事情并不相同(,sql,sql-server,Sql,Sql Server,关于要求,您应该要求OP提供适当的样本数据,以便我们在回答中使用。尽管如此,我的方法的主要好处是,您不必对记录进行随机排序,因为它们已经是随机的了。如果需要的话?我不知道,你为什么不试试呢?因为事实上,您正在比较两种方法/建议/答案,它们做的事情并不相同(而且比较变得有点毫无意义)@lptr好吧,我已经测试过了。不过我的路还是快了。太好了!如果您将它(选择测试脚本)编辑到您的答案中,它将恰好(或非常接近)OP所寻找的内容。 select right('ZZZZZZ' + format(row_n
关于要求,您应该要求OP提供适当的样本数据,以便我们在回答中使用。尽管如此,我的方法的主要好处是,您不必对记录进行随机排序,因为它们已经是随机的了。如果需要的话?我不知道,你为什么不试试呢?因为事实上,您正在比较两种方法/建议/答案,它们做的事情并不相同(而且比较变得有点毫无意义)@lptr好吧,我已经测试过了。不过我的路还是快了。太好了!如果您将它(选择测试脚本)编辑到您的答案中,它将恰好(或非常接近)OP所寻找的内容。
select right('ZZZZZZ' + format(row_number() over (order by newid()), 'X'), 6)
select top (100000)
cte.*,
concat
(
substring(s.random32, p.p1, 1),
substring(s.random32, p.p2, 1),
substring(s.random32, p.p3, 1),
substring(s.random32, p.p4, 1),
substring(s.random32, p.p5, 1),
substring(s.random32, p.p6, 1)
) as combo6
from
--employees
(
--4mil employees
select top (4000000)
row_number() over(order by @@spid) as empid, --this could be empid, eg. empid as n
a.name as empfirstname, a.name as emplastname, b.type_desc as emptype
from sys.all_objects as a
cross join sys.all_objects as b
) as cte
--random string
cross join
(
--one random string (excluding 1, 0, I, O)
select top (1)
(
select v.v as '*'
from
(values
('2'),('3'),('4'),('5'),('6'),('7'),('8'),('9'),
('A'),('B'),('C'),('D'),('E'),('F'),('G'),('H'),
('J'),('K'),('L'),('M'),('N'), ('P'),('Q'),('R'),
('S'),('T'),('U'),('V'),('W'),('X'),('Y'),('Z')
) as v(v)
order by newid()
for xml path('')
) as random32
) as s
--combo6 positions in string
cross apply
(
select
/*for 32 chars = len(rand32) */
(power(32,0)+(cte.empid-1)%power(32, 1))/power(32,0) as p1,
(power(32,1)+(cte.empid-1)%power(32, 2))/power(32,1) as p2,
(power(32,2)+(cte.empid-1)%power(32, 3))/power(32,2) as p3,
(power(32,3)+(cte.empid-1)%power(32, 4))/power(32,3) as p4,
(power(32,4)+(cte.empid-1)%power(32, 5))/power(32,4) as p5,
(power(32,5)+(cte.empid-1)%power(32, 6))/power(32,5) as p6
) as p
go
create or alter function dbo.[why?]()
returns char(6)
as
begin
declare @combo6 char(6);
declare @randomstring char(32) = cast(session_context(N'randomstring') as char(32));
if @randomstring is null
begin
select @randomstring =
(
select v.v as '*'
from
(values
('2'),('3'),('4'),('5'),('6'),('7'),('8'),('9'),
('A'),('B'),('C'),('D'),('E'),('F'),('G'),('H'),
('J'),('K'),('L'),('M'),('N'), ('P'),('Q'),('R'),
('S'),('T'),('U'),('V'),('W'),('X'),('Y'),('Z')
) as v(v)
order by checksum(@@idle, @@cpu_busy, (select max(last_request_end_time) from sys.dm_exec_sessions where session_id=@@spid), v.v)
for xml path('')
);
end
declare @randomnumber int = 1 + isnull(cast(session_context(N'randomnumber') as int), abs(checksum(@randomstring))%10000000);
select @combo6 = concat(
substring(@randomstring, p.p1, 1),
substring(@randomstring, p.p2, 1),
substring(@randomstring, p.p3, 1),
substring(@randomstring, p.p4, 1),
substring(@randomstring, p.p5, 1),
substring(@randomstring, p.p6, 1)
)
from
(
select
/*for 32 chars = len(rand32) */
(power(32,0)+(@randomnumber-1)%power(32, 1))/power(32,0) as p1,
(power(32,1)+(@randomnumber-1)%power(32, 2))/power(32,1) as p2,
(power(32,2)+(@randomnumber-1)%power(32, 3))/power(32,2) as p3,
(power(32,3)+(@randomnumber-1)%power(32, 4))/power(32,3) as p4,
(power(32,4)+(@randomnumber-1)%power(32, 5))/power(32,4) as p5,
(power(32,5)+(@randomnumber-1)%power(32, 6))/power(32,5) as p6
) as p;
exec sp_set_session_context @key=N'randomstring', @value=@randomstring;
exec sp_set_session_context @key=N'randomnumber', @value=@randomnumber;
return(@combo6);
end
go
exec sp_set_session_context @key=N'randomstring', @value=null;
exec sp_set_session_context @key=N'randomnumber', @value=null;
go
select top (100000) dbo.[why?]() as empid, a.name, b.object_id
from sys.all_objects as a
cross join sys.all_objects as b
go
--drop function dbo.[why?]
WITH TAZ AS
(SELECT CAST('A' COLLATE Latin1_General_BIN AS CHAR(1)) AS LETTER, ASCII('A') AS CAR
UNION ALL
SELECT CAST(CHAR(CAR + 1) COLLATE Latin1_General_BIN AS CHAR(1)), CAR + 1
FROM TAZ
WHERE CHAR(CAR + 1) <= 'Z'
)
SELECT TOP 4000000
T1.LETTER + T2.LETTER + T3.LETTER + T4.LETTER + T5.LETTER + T6.LETTER AS L6
FROM TAZ AS T1
CROSS JOIN TAZ AS T2
CROSS JOIN TAZ AS T3
CROSS JOIN TAZ AS T4
CROSS JOIN TAZ AS T5
CROSS JOIN TAZ AS T6
ORDER BY NEWID()
-- This view is needed for the function to work. Read my blog post for details.
CREATE VIEW dbo.GuidGenerator
AS
SELECT Newid() As NewGuid;
GO
-- slightly modified version to enable the generation of up to 100,000,000 rows.
CREATE FUNCTION dbo.RandomStringGenerator
(
@Length int,
@Count int -- Note: up to 100,000,000 rows
)
RETURNS TABLE
AS
RETURN
WITH E1(N) AS (SELECT N FROM (VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9)) V(N)), -- 10
E2(N) AS (SELECT 1 FROM E1 a, E1 b), --100
E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10,000
Tally(N) AS (SELECT ROW_NUMBER() OVER (ORDER BY @@SPID) FROM E4 a, E4 b) -- 100,000,000
SELECT TOP(@Count)
N As Number,
(
SELECT TOP (@Length) CHAR(
CASE Abs(Checksum(NewGuid)) % 2
WHEN 0 THEN 65 + Abs(Checksum(NewGuid)) % 26 -- Random upper case letter
ELSE 48 + Abs(Checksum(NewGuid)) % 10 -- Random digit
END
)
FROM Tally As t0
CROSS JOIN GuidGenerator
WHERE t0.n <> -t1.n
FOR XML PATH('')
) As RandomString
FROM Tally As t1
GO
SELECT DISTINCT TOP 4000000 Number, RandomString
FROM dbo.RandomStringGenerator(6,100000000)
WHERE RandomString NOT LIKE '%[IiOoLl01]%' -- in case your database's default collation is case sensitive...
WITH Tbl AS
(
SELECT *, ROW_NUMBER() OVER (ORDER BY Em_Id) As Rn
FROM <TableNameHere>
), Rnd AS
(
SELECT DISTINCT TOP 4000000 ROW_NUMBER() OVER (ORDER BY Number) As Rn, RandomString
FROM dbo.RandomStringGenerator(6,100000000)
WHERE RandomString NOT LIKE '%[IiOoLl01]%'
)
SELECT Em_Id, RandomString
FROM Tbl
INNER JOIN rnd
ON Tbl.Rn = Rnd.Rn