вы можете создать таблицу вспомогательных чисел для этого:
-- create helper numbers table, faster than online recursive CTE
-- can use master..spt_values, but actually numbers table will be useful
-- for other tasks too
create table numbers (n int primary key)
;with cte_numbers as (
select 1 as n
union all
select n + 1 from cte_numbers where n < 5000
)
insert into numbers
select n
from cte_numbers
option (maxrecursion 0);
, а затем вставить некоторые номера не имеют в TableA (с использованием присоединиться на row_number()
, так что вы можете вставить несколько строк сразу):
;with cte_n as (
select n.n, row_number() over(order by newid()) as rn
from numbers as n
where not exists (select * from tableA as t where t.columnA = n.n)
), cte_b as (
select
columnB, row_number() over(order by newid()) as rn
from tableB
)
insert into TableA(columnA, columnB)
select n.n, b.ColumnB
from cte_b as b
inner join cte_n as n on n.rn = b.rn
Если йо u're уверен, что может быть только одна строка из TableB, который будет вставлен, вы можете использовать этот запрос
insert into TableA(columnA, columnB)
select
a.n, b.columnB
from tableB as b
outer apply (
select top 1 n.n
from numbers as n
where not exists (select * from tableA as t where t.columnA = n.n)
order by newid()
) as a
Примечание это лучше иметь индекс на ColumnA
колонке, чтобы проверить наличие быстрее.
sql fiddle demo
Я надеюсь, что это [статья] (http://www.sqlperformance.com/2013/09/t-sql-queries/random-collisions) помогает. –