Implémentation de SQL Server 2005 de MySQL REPLACE INTO?

Translate

MySQL a ce incroyablement utile mais appropriéREPLACE INTOCommande SQL.

Cela peut-il être facilement émulé dans SQL Server 2005?

Démarrer une nouvelle transaction, faire uneSelect()et puis soitUPDATEouINSERTetCOMMITest toujours un peu pénible, surtout quand on le fait dans l'application et donc toujours en gardant 2 versions de l'instruction.

Je me demande s'il existe une méthode facile etuniverselmoyen d'implémenter une telle fonction dans SQL Server 2005?

This question and all comments follow the "Attribution Required."

Toutes les réponses

Translate

C'est quelque chose qui me dérange à propos de MSSQL (diatribe sur mon blog). Je souhaite que MSSQL soit pris en chargeupsert.

Le code de @ Dillie-O est un bon moyen dans les anciennes versions SQL (+1 vote), mais il s'agit toujours essentiellement de deux opérations d'E / S (leexistspuis leupdateouinsert)

Il y a un moyen légèrement meilleur surce post, fondamentalement:

--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', ... )

Cela le réduit à une opération d'E / S s'il s'agit d'une mise à jour, ou à deux s'il s'agit d'une insertion.

MS Sql2008 présentemergede la norme 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, ... )

Maintenant, c'est vraiment juste une opération d'E / S, mais un code horrible :-(

La source
Translate

La fonctionnalité que vous recherchez est traditionnellement appelée UPSERT. Au moins savoir comment cela s'appelle peut vous aider à trouver ce que vous recherchez.

Je ne pense pas que SQL Server 2005 ait d'excellents moyens de faire cela. 2008 introduit l'instruction MERGE qui peut être utilisée pour accomplir cela comme indiqué dans:http://www.databasejournal.com/features/mssql/article.php/3739131ouhttp://blogs.conchango.com/davidportas/archive/2007/11/14/SQL-Server-2008-MERGE.aspx

Merge était disponible dans la version bêta de 2005, mais ils l'ont supprimé dans la version finale.

La source
Translate

Ce que fait la montée / fusion est quelque chose qui a pour effet de ...

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

J'espère donc que la combinaison de ces articles et de ce pseudo code pourra faire bouger les choses.

La source
Translate

J'ai écrit unarticle de blog sur ce problème.

L'essentiel est que si vous voulez des mises à jour bon marché ... et que vous voulez être sûr pour une utilisation simultanée. essayer:

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

De cette façon, vous avez 1 opération pour les mises à jour et un maximum de 3 opérations pour les insertions. donc, si vous mettez généralement à jour, c'est une option sûre et bon marché.

Je ferais également très attention de ne pas utiliser quoi que ce soit qui n'est pas sûr pour une utilisation simultanée. Il est très facile d'obtenir des violations de clé primaire ou de dupliquer des lignes en production.

La source