цикл через многочисленные "если существует обновление, еще вставить" заявления? - PullRequest
3 голосов
/ 22 сентября 2010

У меня есть скрипт, который должен вставить более 50 строк в таблицу, есть ли способ зациклить каждую строку, которую я хочу вставить, вместо того чтобы кодировать этот оператор 50+ раз в TSQL?

IFEXISTS ( SELECT 1 FROM table where column 1 = )
    UPDATE table
    Column1 = value,
    Column2 = value,
    Column3 = value,
    Column4 = value
    WHERE column 1 =
    ELSE
    INSERT INTO table
    (Column1, Column2, Column3, Column4)
    VALUES
    (value, value, value, value)

Ответы [ 3 ]

7 голосов
/ 22 сентября 2010

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

Пример:

select Column1 = 1, Column2 = 2, Column3 = 3
into #temp
union all select 1,2,3
union all select 1,2,3
union all select 1,2,3
...
union all select 1,2,3

update t
set Column1 = p.Column1, Column2 = p.Column2, Column3 = p.Column3
from table t
inner join #temp p on p.Column1 = t.Column1

insert into table (Column1, Column2, Column3)
select p.Column1, p.Column2, p.Column3
from #temp p
left join table t on t.Column1 = p.Column1
where t.Column1 is null

drop table #temp
0 голосов
/ 22 сентября 2010

Рассмотрим оператор MERGE (и, в частности, первый пример на связанной странице).

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

0 голосов
/ 22 сентября 2010

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

Вот еще один подход из блога MSDN :

UPDATE Table1 SET (...) WHERE Column1='SomeValue'
IF @@ROWCOUNT=0
    INSERT INTO Table1 VALUES (...)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...