Сведения о вопросе

Electro Full

16:03, 1st July, 2020

Теги

SQL Server 2005 реализация функции MySQL REPLACE INTO?

Просмотров: 452   Ответов: 4

MySQL имеет эту невероятно полезную, но правильную команду REPLACE INTO SQL.

Можно ли это легко эмулировать в SQL Server 2005?

Запуск новой транзакции, выполнение Select() , а затем либо UPDATE , либо INSERT и COMMIT -это всегда немного больно, особенно когда вы делаете это в приложении и поэтому всегда сохраняете 2 версии инструкции.

Интересно, есть ли простой и универсальный способ реализовать такую функцию в SQL Server 2005?



  Сведения об ответе

VERSUION

18:03, 1st July, 2020

Это то, что меня раздражает в MSSQL ( разглагольствования в моем блоге ). Я бы хотел, чтобы MSSQL поддержал upsert .

Код @Dillie-O's-это хороший способ в более старых версиях SQL (+1 голос), но это все еще в основном две операции IO ( exists и затем update или insert )

Есть немного лучший способ на этом посту , в основном:

--try an update
update tablename 
set field1 = 'new value',
    field2 = 'different value',
    ...
where idfield = 7

--insert if failed
if @@rowcount = 0 and @@error = 0
    insert into tablename 
           ( idfield, field1, field2, ... )
    values ( 7, 'value one', 'another value', ... )

Это уменьшает его до одной операции IO, если это обновление,или двух, если вставка.

MS Sql2008 вводит merge из стандарта SQL:2003:

merge tablename as target
using (values ('new value', 'different value'))
    as source (field1, field2)
    on target.idfield = 7
when matched then
    update
    set field1 = source.field1,
        field2 = source.field2,
        ...
when not matched then
    insert ( idfield, field1, field2, ... )
    values ( 7,  source.field1, source.field2, ... )

Теперь это действительно просто одна операция IO, но ужасный код :-(


  Сведения об ответе

pumpa

18:03, 1st July, 2020

Функциональность, которую вы ищете, традиционно называется UPSERT. По крайней мере, знание того, как это называется, может помочь вам найти то, что вы ищете.

Я не думаю, что SQL Server 2005 имеет какие-либо отличные способы сделать это. 2008 вводит оператор MERGE, который может быть использован для выполнения этого, как показано в: http://www.databasejournal.com/features/mssql/article.php/3739131 или http://blogs.conchango.com/davidportas/archive/2007/11/14/SQL-Server-2008-MERGE.aspx

Слияние было доступно в бета-версии 2005 года, но они удалили его в финальном релизе.


  Сведения об ответе

DAAA

18:03, 1st July, 2020

Что за вставки/слияние делает что-то эффекта...

IF EXISTS (SELECT * FROM [Table] WHERE Id = X)
   UPDATE [Table] SET...
ELSE
   INSERT INTO [Table]

Так что, надеюсь, сочетание этих статей и этого псевдокода может сдвинуть дело с мертвой точки.


  Сведения об ответе

9090

18:03, 1st July, 2020

Я написал сообщение в блоге по этому поводу .

Суть в том, что если вы хотите дешевые обновления ... и вы хотите быть в безопасности для одновременного использования. пробовать:

update t
set hitCount = hitCount + 1
where pk = @id

if @@rowcount < 1 
begin 
   begin tran
      update t with (serializable)
      set hitCount = hitCount + 1
      where pk = @id
      if @@rowcount = 0
      begin
         insert t (pk, hitCount)
         values (@id,1)
      end
   commit tran
end

Таким образом, у вас есть 1 операция для обновлений и максимум 3 операции для вставок. так что, если вы обычно обновляете это безопасный дешевый вариант.

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться