#sql #sql-server-2005 #tsql
#sql #sql-server-2005 #tsql
Вопрос:
Я получил таблицу с приблизительно 13066 записями, в которую я хочу добавить все остальные записи из другой таблицы (с приблизительно 1346 записями). Существует хранимая процедура, которая выполняет вставку, и я хочу использовать ее для вставки всех записей. Кто-нибудь может, пожалуйста, помочь?
Комментарии:
1. Какова структура для обеих таблиц?
2. обе таблицы имеют одинаковую структуру, в основном они идентичны. Мне нужно запустить хранимую процедуру, потому что она обслуживает некоторые ячейки, которые заполняются с ее помощью путем сверки с существующими данными в таблице с 13066 записями.
3. Каковы параметры вашей существующей хранимой процедуры?
Ответ №1:
Это так просто, если только вы не предоставили всю информацию, такую как «есть дубликаты» или «только если их еще нет»
CREATE PROC DoSomething
AS
SET NOCOUNT ON
INSERT table1 (col1, col2, etc)
SELECT col1, col2, etc FROM table2
GO
Редактировать:
Чего-то не хватает.
OP хочет, чтобы цикл через table2 мог вызывать существующую хранимую процедуру
Чтобы сделать это правильно, вы бы использовали
INSERT table1 (col1, col2, etc)
SELECT col1, col2, etc FROM table2 t2
WHERE NOT EXISTS (SELECT * FROM table1 t1
WHERE t1.key = t2.key and <some conditions>)
Комментарии:
1. У меня уже есть хранимая процедура под названием stp_dosomethingInsert, которую необходимо использовать, потому что она обслуживает некоторые ячейки, которые заполняются с ее помощью путем сверки с существующими данными в таблице с 13066 записями
2. Мне нужен способ перебирать таблицу 2 (одна вставляется) и добавлять записи одну за другой, используя эту хранимую процедуру. любые предложения, пожалуйста
3. @IanCian: то есть ваша хранимая процедура возвращает по одной строке за раз? Какое отношение вторая таблица имеет к хранимой процедуре
4. моя хранимая процедура выполняет ВСТАВКУ по одной строке за раз. Мне нужно использовать его для вставки всех данных из таблицы 2 в таблицу 1 за один раз.
5. @IanCian: это был бы цикл по table2. Что глупо
Ответ №2:
Возможно, я неправильно истолковал ваш вопрос, но похоже, что вы хотите выполнить хранимую процедуру и вставить результаты хранимой процедуры в свою основную таблицу.
Для этого вы можете сделать:
INSERT INTO dbo.YourMainTable
EXEC dbo.YourStoredProcedureName
Редактировать:
Единственный способ, который я могу придумать для этого, — использовать курсор.
DECLARE @PrimaryKeyFieldInTable2 int
DECLARE spCur CURSOR LOCAL FOR
SELECT PrimaryKetCol From Table2
OPEN spCur
FETCH NEXT FROM spCur INTO @PrimaryKeyFieldInTable2
WHILE @@FETCH_STATUS = 0 BEGIN
INSERT INTO dbo.Table1
EXEC dbo.YourStoredProceudre @PrimaryKeyFieldInTable2
FETCH NEXT FROM spCur INTO @PrimaryKeyFieldInTable2
END
CLOSE spCur
DEALLOCATE spCur
Это предполагает, что ваша хранимая процедура принимает один параметр для выбора каждой строки из Таблицы2.
Это не лучшее использование SQL Server, но если вы действительно должны сделать это таким образом, то я не могу придумать никакого другого способа.
Комментарии:
1. Позвольте мне попытаться объяснить лучше. У меня есть таблица1, в которую я хочу поместить все данные таблицы 2. Теперь существует хранимая процедура, которая уже делает это, но только для одной записи. Я хочу использовать эту хранимую процедуру для ввода всех записей таблицы 2 в таблицу 1
2. @IanCian: Это глупо. Вы бы перебирали каждую строку в table2, а не выполняли прямую вставку, как я. Условие в вашей сохраненной процедуре может быть введено в INSERT..SELECT. Я собираюсь отклонить ваш вопрос из-за запроса цикла. @Barry: 1 за вашу интерпретацию
3. @IanCian: вы можете это сделать, но в зависимости от производительности вашей хранимой процедуры, это может быть ооооооочень низко для тысяч вызовов подряд.
4. Я обновил свой ответ. Если вам действительно необходимо сделать это таким образом, то курсор, вероятно, является единственным способом. Хотя это не то, что я бы рекомендовал делать очень часто.
5. @gbn: пожалуйста, не голосуйте против. Не каждый, кто работает со stack overflow, обязан знать, что циклы в базе данных в большинстве случаев являются ужасным выбором. Мы, как сообщество, могли бы попытаться объяснить это. Кроме того, в его случае наличие цикла могло бы быть приемлемым. Он просто хочет повторно использовать любую бизнес-логику, которая уже закодирована в хранимую процедуру, это очень естественное желание. Если, например, объем данных, которые он собирается вставить, невелик, а хранимая процедура относительно (с учетом его ограничений) быстра, нет ничего плохого в быстром и грязном кодировании цикла. Вы когда-нибудь слышали о «одноразовом» коде? =)