Это гораздо лучше подходит для подсчета. Цикл WHILE
- худший способ сделать это. Это очень медленно.
Если у вас есть таблица доменных адресов, то вы можете просто сделать что-то вроде:
WITH Tally AS(
SELECT N
FROM (VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9),(10))N(N))
SELECT N1.N AS x,
N2.N AS y,
N3.N AS z,
D.Domain
FROM dbo.DomainTable D
CROSS JOIN N N1
CROSS JOIN N N2
CROSS JOIN N N3;
Это создаст 1000 (10 * 10 * 10) строк длякаждый адрес электронной почты, с вариациями x
, y
и z
.
. Для более «динамического» подхода:
DECLARE @x int = 10,
@y int = 10,
@z int = 1;
DECLARE @m int = (SELECT MAX(V.N) FROM (VALUES(@x),(@y),(@z))V(N));
WITH N AS(
SELECT N
FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N)),
Tally AS(
SELECT TOP (@m)
ROW_NUMBER () OVER (ORDER BY (SELECT NULL)) AS I
FROM N N1, N N2, N N3, N N4) --this'll create 10,000 rows
SELECT T1.I AS x,
T2.I AS y,
T3.I AS z,
D.Domain
FROM dbo.DomainTable D
CROSS JOIN Tally T1
CROSS JOIN Tally T2
CROSS JOIN Tally T3
WHERE T1.I <= @x
AND T2.I <= @y
AND T3.I <= @z;
Если @x
, @y
и @z
имели значение 1000
, тогда это создаст 1000 ^ 3 (1 000 000 000) строк, и он принимает значение до 10 000.
Однако я не рекомендую ни на одну секундучто вы действительно пытаетесь создать более 1 миллиона строк за один раз;это просто заполнит ваш журнал транзакций и, вероятно, приведет к сбою.