Одна хранимая процедура, насколько это возможно:
INSERT INTO MyTable(field1,field2)
SELECT "firstValue", "secondValue"
UNION ALL
SELECT "anotherFirstValue", "anotherSecondValue"
UNION ALL
Если вы не уверены, сколько элементов вы вставляете, вы можете создать SQL-запрос в sproc, а затем выполнить его.Вот процедура, которую я написал, чтобы взять список групп CSV и добавить их отношение к объекту пользователя:
ALTER PROCEDURE [dbo].[UpdateUserADGroups]
@username varchar(100),
@groups varchar(5000)
AS
BEGIN
DECLARE @pos int,
@previous_pos int,
@value varchar(50),
@sql varchar(8000)
SET @pos = 1
SET @previous_pos = 0
SET @sql = 'INSERT INTO UserADGroups(UserID, RoleName)'
DECLARE @userID int
SET @userID = (SELECT TOP 1 UserID FROM Users WHERE Username = @username)
WHILE @pos > 0
BEGIN
SET @pos = CHARINDEX(',',@groups,@previous_pos+1)
IF @pos > 0
BEGIN
SET @value = SUBSTRING(@groups,@previous_pos+1,@pos-@previous_pos-1)
SET @sql = @sql + 'SELECT ' + cast(@userID as char(5)) + ',''' + @value + ''' UNION ALL '
SET @previous_pos = @pos
END
END
IF @previous_pos < LEN(@groups)
BEGIN
SET @value = SUBSTRING(@groups,@previous_pos+1,LEN(@groups))
SET @sql = @sql + 'SELECT ' + cast(@userID as char(5)) + ',''' + @value + ''''
END
print @sql
exec (@sql)
END
Это намного быстрее, чем отдельные ВСТАВКИ.
Кроме того, убедитесь, что вы простоодин кластеризованный индекс на первичном ключе, большее количество индексов замедлит вставку, поскольку им потребуется обновить.
Однако, чем сложнее ваш набор данных, тем меньше вероятность, что вы сможетесделайте выше, так что вам просто придется идти на логические компромиссы.Я на самом деле заканчиваю вызывать вышеупомянутую процедуру около 8000 раз.