Pregunta

MySQL tiene este increíblemente útil pero propio REPLACE INTO Comando SQL.

¿Se puede emular esto fácilmente en SQL Server 2005?

Iniciar una nueva transacción, realizar una Select() y luego cualquiera UPDATE o INSERT y COMMIT Siempre es un poco molesto, especialmente cuando se hace en la aplicación y, por lo tanto, siempre se mantienen 2 versiones de la declaración.

Me pregunto si hay una manera fácil y universal ¿Manera de implementar tal función en SQL Server 2005?

¿Fue útil?

Solución

Esto es algo que me molesta de MSSQL (despotricar en mi blog).Deseo que MSSQL sea compatible upsert.

El código de @ Dillie-O es una buena forma en versiones anteriores de SQL (+1 voto), pero sigue siendo básicamente dos operaciones IO (la exists y luego el update o insert)

Hay una manera un poco mejor esta publicación, básicamente:

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

Esto lo reduce a una operación IO si se trata de una actualización, o dos si se trata de una inserción.

MS Sql2008 presenta merge del estándar 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, ... )

Ahora en realidad es solo una operación IO, pero un código horrible :-(

Otros consejos

La funcionalidad que busca se denomina tradicionalmente UPSERT.Al menos saber cómo se llama podría ayudarte a encontrar lo que estás buscando.

No creo que SQL Server 2005 tenga buenas formas de hacer esto.2008 introduce la declaración MERGE que se puede utilizar para lograr esto como se muestra en: http://www.databasejournal.com/features/mssql/article.php/3739131 o http://blogs.conchango.com/davidportas/archive/2007/11/14/SQL-Server-2008-MERGE.aspx

Merge estaba disponible en la versión beta de 2005, pero lo eliminaron en la versión final.

Lo que está haciendo la inserción/fusión es algo así como...

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

Con suerte, la combinación de esos artículos y este pseudocódigo puede hacer que las cosas avancen.

escribí un publicación de blog sobre este tema.

La conclusión es que si quieres actualizaciones baratas...y desea estar seguro para el uso simultáneo.intentar:

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 esta manera tienes 1 operación para actualizaciones y un máximo de 3 operaciones para inserciones.por lo tanto, si generalmente está actualizando, esta es una opción segura y económica.

También tendría mucho cuidado de no utilizar nada que no sea seguro para uso simultáneo.Es realmente fácil obtener infracciones de clave principal o filas duplicadas en producción.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top