Я хочу вставить, скажем, 50 000 записей в базу данных sql server 2000 за раз. Как этого добиться?


Вы имеете в виду какой-то тест?
declare @index integer
set @index = 0
while @index < 50000
begin
insert into table
values (x,y,z)
set @index = @index + 1
end
Но я думаю, вы не это имеете в виду.
Если вы имеете в виду лучший способ сделать объемную вставку, используйте BULK INSERT или что-то вроде bcp.
Вы вставляете из другой базы данных / таблицы программно или из плоского файла?
Из внешнего источника данных можно использовать bcp для импорта данных. Ключ -b позволяет указать размер пакета.
Вы можете использовать предложение SELECT TOP: в MSSQL 2005 оно было расширено, позволяя использовать переменную для указания количества записей (более старая версия допускала только числовую константу)
Вы можете попробовать что-то вроде этого: (не проверено, потому что в данный момент у меня нет доступа к MSSQL2005)
begin
declare @n int, @rows int
select @rows = count(*) from sourcetable
select @n=0
while @n < @rows
begin
insert into desttable
select top 2000 *
from sourcetable
where id_sourcetable not in (select top (@n) id_sourcetable
from sourcetable
order by id_sourcetable)
order by id_sourcetable
select @n=@n+2000
end
end
Да, я сделал это примерно так. Но вместо того, чтобы использовать NOT IN, я использовал NOT EXISTS, который должен обеспечить лучшую производительность.
объявить @rows как int установить @rows = 1 а @rows> 0
insert mytable (field1, field2, field3)
select top 2000 pa.field1, pa.field2, pa.field3
from table1 pa (nolock)
left join mytable ta (nolock)on ta.field2 = pa.feild2
and ta.field3 = pa.field3 and ta.field1 = pa.field1
where ta.field1 is null
order by pa.field1
установить @rows = @@ rowcount
конец
Это код, который мы в настоящее время используем в производственной среде в SQL Server 2000 с измененными именами таблиц и полей.
С SQL 2000 я бы, вероятно, полагался на DTS, чтобы сделать это в зависимости от того, где были расположены данные. Вы можете конкретно указать DTS, что использовать для размера пакетной фиксации. В противном случае подойдет модифицированная версия пакетного решения SQL 2005. Я не думаю, что вы можете использовать TOP с переменной в SQL 2000.
Подтверждаю, использование переменной было добавлено в SQL2005
Не совсем. 50 000 строк, но 2000 за раз.