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.