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




trigger replace into (3)

C'est quelque chose qui m'agace à propos de MSSQL ( discours sur mon blog ). Je souhaite upsert soutenu MSSQL.

Le code de @ Dillie-O est un bon moyen dans les anciennes versions de SQL (+1 vote), mais il reste toujours deux opérations d'E / S (la exists , puis la update ou l' insert )

Il y a un moyen légèrement meilleur sur ce post , essentiellement:

--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 si une insertion.

MS SQL2008 introduit la merge partir du standard 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 IO, mais le code terrible :-(

MySQL a cette commande REPLACE INTO SQL incroyablement utile et pourtant appropriée.

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

Commencer une nouvelle transaction, faire un Select() puis UPDATE ou INSERT et COMMIT est toujours un peu pénible, surtout lorsque vous le faites dans l'application et que vous conservez donc toujours 2 versions de l'instruction.

Je me demande s’il existe un moyen simple et universel d’implémenter une telle fonction dans SQL Server 2005?


Ce que l'upsert / merge fait est quelque chose à l'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 peut faire avancer les choses.


La fonctionnalité que vous recherchez s'appelle traditionnellement un UPSERT. Au moins, savoir comment cela s'appelle peut vous aider à trouver ce que vous cherchez.

Je ne pense pas que SQL Server 2005 offre de bonnes façons de procéder. 2008 introduit l'instruction MERGE qui peut être utilisée à cette fin, comme indiqué dans: http://www.databasejournal.com/features/mssql/article.php/3739131 ou http://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.





sql-server-2005