2012-06-28 2 views
0

Я хочу создать таблицу с несколькими записями в ней, а затем запустить набор операторов sql для каждой записи в этой таблице. Я бы использовал данные в таблице, чтобы установить значения в инструкции sql.Выполнение операторов SQL во время цикла таблицы

Это должно позволить мне написать SQL только один раз, а затем запустить его для любых данных, которые я помещал в таблицу.

Но, я не уверен, как это сделать. Должен ли я использовать курсор для циклирования таблицы? Какой-то другой способ?

Спасибо за любую помощь или совет, который вы можете мне дать.

+0

Да, «CURSOR» будет работать. Но будет ли это лучшее решение, зависит от того, что именно вы попытаетесь сделать внутри цикла (вам может и не понадобится). – bfavaretto

+0

Какая база данных? Это больше похоже на работу хранимых процедур. – Tawnos

+0

@bfavaretto Я собираюсь добавить несколько инструкций INSERT для заполнения ряда таблиц. – WilliamB2

ответ

1

КУРСОР будет иметь связанные с ним накладные расходы, но может быть хорошим способом пройти через ваш стол. Они не являются совершенно ненужным злом и имеют свое место.

Имея ограниченную информацию, предоставленную WilliamB2, похоже, что набор CURSOR может быть хорошим решением для этой проблемы, чтобы пройти через его данные и генерировать множественные нисходящие INSERT.

0

Да, вы можете использовать курсор. Вы также можете использовать цикл while

declare @table as table(col1 int, col2 varchar(20)) 

declare @col1 int 
declare @col2 varchar(50) 

declare @sql varchar(max) 

insert into @table 
SELECT col1, col2 FROM OriginalTable 

while(exists(select top 1 'x' from @table)) --as long as @table contains records continue 
begin 
    select top 1 @col1=col1, @col2=col2 from @table 

    SET @sql = 'INSERT INTO Table t VALUES('+cast(@col1 as varchar)+')' 


    delete top (1) from @table --remove the previously processed row. also ensures no infinite loop 
end 

Я думаю, что курсор имеет накладные расходы, прикрепленные к нему.

С этим вторым подходом, не работает на исходную таблице

+0

Обратите внимание, что на строке «SET @sql =» вам нужно будет выполнить эти инструкции в отношении вашей базы данных или каким-то образом собрать их для последующего выполнения. Также обратите внимание, что вы дублируете в памяти свой оригинал, который может повлечь некоторые издержки памяти. – Marshall

+1

Да, это правда. Но таблица не будет заблокирована CURSOR во время цикла. – codingbiz

0

Может быть, вы могли бы использовать INSERT...SELECT вместо цикла:

INSERT INTO target_table 
SELECT 
    some_col, 
    some_other_col, 
    'Some fixed value', 
    NULL, 
    42, 
    you_get_the_idea 
FROM source_table 
WHERE source_table.you_get_the_idea = 1 

Колонка на ваш SELECT должен соответствовать структуре целевой таблицы (вы можете опустить int/identity pk, например id, если у вас есть).

Если это лучший вариант, или цикл зависит от того, сколько таблиц вы хотите заполнить внутри цикла. Если это всего лишь несколько, я обычно придерживаюсь INSERT...SELECT.

+0

Я фактически не вставляю данные из исходной таблицы в свою целевую таблицу. Я использую поля в исходной таблице для установки параметров в своих инструкциях INSERT для заполнения других таблиц. Например, если в моей исходной таблице была вся информация, которую я имел о разных типах фруктов, и я использовал это, чтобы затем добавить кучу статистики о фруктах в другую таблицу. – WilliamB2

Смежные вопросы