SQL Server 2005 mise en œuvre de MySQL REPLACE INTO?

voix
73

MySQL a ce incroyablement utile encore properitary REPLACE INTOcommande SQL.

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

Démarrage d' une nouvelle transaction, faire un Select()puis deux UPDATEou INSERT IGNORE et COMMITest toujours un peu d'une douleur, surtout quand le faire dans l'application et donc en gardant toujours 2 versions de la déclaration.

Je me demande s'il y a un moyen facile et universel moyen de mettre en œuvre une telle fonction dans SQL Server 2005?

Créé 01/08/2008 à 23:13
source utilisateur
Dans d'autres langues...                            


4 réponses

voix
53

C'est quelque chose qui me dérange au sujet MSSQL ( diatribe sur mon blog ). Je souhaite soutenu MSSQL upsert.

@ Code de Darlie-O est une bonne façon dans les anciennes versions SQL (1 vote), mais il est encore essentiellement deux opérations d' entrées - sorties (la exists, puis le updateou insert)

Il y a une façon un peu mieux sur ce poste , 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 réduit à une des opérations IO si elle est une mise à jour, ou deux si un insert.

MS SQL2008 introduit à mergepartir 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, il est vraiment une seule opération IO, mais le code terrible :-(

Créé 15/08/2008 à 13:50
source utilisateur

voix
20

La fonctionnalité que vous cherchez est traditionnellement appelé UPSERT. Atleast savoir ce qu'il appelle pourrait vous aider à trouver ce que vous cherchez.

Je ne pense pas que SQL Server 2005 a des grandes façons de le faire. 2008 introduit l'instruction MERGE qui peut être utilisé pour accomplir cela 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

Fusion était disponible dans la version bêta de 2005, mais ils ont enlevé dans la version finale.

Créé 01/08/2008 à 23:22
source utilisateur

voix
15

Ce que le upsert / fusion fait est quelque chose à l'effet de ...

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

Alors, espérons-la combinaison de ces articles et ce code pseudo peut faire bouger les choses.

Créé 01/08/2008 à 23:31
source utilisateur

voix
9

J'ai écrit un blog sur cette question .

L'essentiel est que si vous voulez des mises à jour à bas prix ... et 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 inserts. Donc, si vous mettez à jour généralement c'est une option pas cher en toute sécurité.

Je serais également très attention à ne pas utiliser tout ce qui est dangereux pour une utilisation simultanée. Il est vraiment facile d'obtenir des violations clés primaires ou les lignes en double dans la production.

Créé 21/09/2008 à 23:05
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more