strings into example data cadena all mysql sql-server sql-server-2005

into - replace strings mysql



Implementación de SQL Server 2005 de MySQL REPLACE INTO? (4)

MySQL tiene este comando REPLACE INTO SQL increíblemente útil pero adecuado.

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

Comenzar una nueva transacción, hacer una Select() y luego UPDATE o INSERT y COMMIT siempre es un poco molesto, especialmente cuando lo hace en la aplicación y, por lo tanto, siempre mantiene 2 versiones de la declaración.

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


Escribí una publicación de blog sobre este tema .

La conclusión es que si quieres actualizaciones baratas ... y quieres estar seguro para el uso concurrente. tratar:

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, tiene 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 sería muy cuidadoso de no usar nada que no sea seguro para el uso concurrente. Es realmente fácil obtener violaciones de clave principal o filas duplicadas en producción.


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

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

Hay una forma ligeramente mejor en 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 de E / S si es una actualización, o dos si es una inserción.

MS Sql2008 introduce la 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 es realmente solo una operación de E / S, pero un código horrible :-(


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

No creo que SQL Server 2005 tenga grandes formas de hacer esto. 2008 presenta 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 el upsert / merge es algo en el sentido de ...

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

Esperemos que la combinación de esos artículos y este pseudocódigo puedan hacer que las cosas se muevan.