SQL Server 2005 Implementación de MySQL Reemplazar en? -- mysql campo con sql-server campo con sql-server-2005 camp Relacionados El problema

SQL Server 2005 implementation of MySQL REPLACE INTO?


87
vote

problema

Español

MySQL tiene este comando increíblemente útil y propietario 99887776611 SQL.

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

Inicio de una nueva transacción, haciendo un Select() y luego UPDATE o INSERT y COMMIT es siempre un Un poco de dolor, especialmente al hacerlo en la solicitud y, por lo tanto, siempre manteniendo 2 versiones de la declaración.

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

Original en ingles

MySQL has this incredibly useful yet proprietary REPLACE INTO SQL Command.

Can this easily be emulated in SQL Server 2005?

Starting a new Transaction, doing a Select() and then either UPDATE or INSERT and COMMIT is always a little bit of a pain, especially when doing it in the application and therefore always keeping 2 versions of the statement.

I wonder if there is an easy and universal way to implement such a function into SQL Server 2005?

</div
        

Lista de respuestas

60
 
vote
vote
La mejor respuesta
 

Esto es algo que me molesta por MSSQL ( rant en mi blog ). Deseo que MSSQL sea compatible con upsert .

@ El código de Dillie-O es una buena manera en las versiones más antiguas de SQL (+1 vote), pero aún es básicamente dos operaciones IO (el exists y luego el 9988777668 O insert )

Hay una forma ligeramente mejor en este post , básicamente:

  [HKEY_CLASSES_ROOTmailtoshellopencommand]0  

Esto lo reduce a una Operaciones de IO si es una actualización, o dos si un inserto.

MS SQL2008 introduce [HKEY_CLASSES_ROOTmailtoshellopencommand]11111111 de la norma SQL: 2003:

  [HKEY_CLASSES_ROOTmailtoshellopencommand]2  

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

 

This is something that annoys me about MSSQL (rant on my blog). I wish MSSQL supported upsert.

@Dillie-O's code is a good way in older SQL versions (+1 vote), but it still is basically two IO operations (the exists and then the update or insert)

There's a slightly better way on this post, basically:

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

This reduces it to one IO operations if it's an update, or two if an insert.

MS Sql2008 introduces merge from the SQL:2003 standard:

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

Now it's really just one IO operation, but awful code :-(

</div
 
 
         
         
21
 
vote

La funcionalidad que está buscando tradicionalmente se llama un upsert. Al menos saber lo que se llama podría ayudarlo a encontrar lo que está buscando.

No creo que SQL Server 2005 tiene grandes formas de hacerlo. 2008 presenta la instrucción MERGE que se puede usar 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

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

 

The functionality you're looking for is traditionally called an UPSERT. Atleast knowing what it's called might help you find what you're looking for.

I don't think SQL Server 2005 has any great ways of doing this. 2008 introduces the MERGE statement that can be used to accomplish this as shown in: http://www.databasejournal.com/features/mssql/article.php/3739131 or http://blogs.conchango.com/davidportas/archive/2007/11/14/SQL-Server-2008-MERGE.aspx

Merge was available in the beta of 2005, but they removed it out in the final release.

</div
 
 
18
 
vote

Qué está haciendo el UPSERT / FERGE es algo al efecto de ...

  [HKEY_CLASSES_ROOTmailtoshellopencommand]3  

Entonces, espero que la combinación de esos artículos y este pseudo código pueda mover las cosas.

 

What the upsert/merge is doing is something to the effect of...

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

So hopefully the combination of those articles and this pseudo code can get things moving.

</div
 
 
10
 
vote

Escribí un Publicación de blog sobre esto problema.

La línea inferior es que si desea actualizaciones baratas y desea que sea seguro para el uso concurrente, intente:

  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 insertos. Por lo tanto, si generalmente está actualizando, esta es una opción barata segura.

También tendría mucho cuidado de no usar nada que sea inseguro para el uso concurrente. Es realmente fácil obtener violaciones de clave principal o filas duplicadas en la producción.

 

I wrote a blog post about this issue.

The bottom line is that if you want cheap updates and want to be safe for concurrent usage, try:

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 

This way you have 1 operation for updates and a max of 3 operations for inserts. So, if you are generally updating, this is a safe cheap option.

I would also be very careful not to use anything that is unsafe for concurrent usage. It's really easy to get primary key violations or duplicate rows in production.

</div
 
 

Relacionados problema

30  ¿Por qué el proveedor OLEDB de VFP INET no funciona en ventanas de 64 bits?  ( Why doesnt vfp net oledb provider work in 64 bit windows ) 
Escribí un servicio de Windows usando VB que lee algunos datos heredados de las bases de datos de Visual FoxPro que se insertan en SQL 2005. El problema es qu...

87  SQL Server 2005 Implementación de MySQL Reemplazar en?  ( Sql server 2005 implementation of mysql replace into ) 
MySQL tiene este comando increíblemente útil y propietario 99887776611 SQL. ¿Se puede emular fácilmente en SQL Server 2005? Inicio de una nueva transacc...

26  ¿Por qué la indexación de texto completo de SQL no tiene resultados de devolución de texto para las palabras que contienen #?  ( Why doesnt sql full text indexing return results for words containing ) 
Por ejemplo, mi consulta es como la siguiente utilizando SQL Server 2005: SELECT * FROM Table WHERE FREETEXT(SearchField, 'c#') Tengo un índice de tex...

0  ¿Pueden las vistas del DMV obtener un reinicio sin pateando EveyOne Out of the DB?  ( Can the dmv views get reset without kicking eveyone out of the db ) 
He visto publicaciones que muestran tres formas de restablecer las vistas del DMV: restablecer el servicio SQL detector de la base de datos cerrar la b...

14  Collación del cliente y SQL Server 2005  ( Client collation and sql server 2005 ) 
Estamos actualizando un programa existente de Win2k/SQL Server 2k a Windows 2003 and SQL Server 2005 , así como la compra de un nuevo programa que también ...

16  Windows Server 2008 como máquina de desarrollo - paso a paso  ( Windows server 2008 as development machine step by step ) 
He encontrado muchos tutoriales sobre el uso de Windows Server 2003 como una máquina de desarrollo, y muy poca información sobre Windows Server 2008 para el m...

30  Desplegando bases de datos de SQL Server de la prueba para vivir  ( Deploying sql server databases from test to live ) 
Me pregunto cómo ustedes administran la implementación de una base de datos entre 2 servidores SQL, específicamente SQL Server 2005. Ahora, hay un desarrollo ...

0  Cómo verificar si la identificación actual sale en esa tabla o no  ( How to check if current id exits in that table or not ) 
Estoy usando vb.net y SQL Server 2005. Tengo GridView en aplicación donde tengo mi cpuserid . Puede haber miles de registros en GridView con cpuserids dife...

88  Cómo exportar datos de SQL Server 2005 a MySQL [CERRADO]  ( How to export data from sql server 2005 to mysql ) 
cerrado. Esta pregunta es off-topic . Actualmente no está aceptando respuestas. ¿Quieres ...

0  Cree un error en un paquete SSIS basado en el valor de retorno  ( Create an error in an ssis package based on return value ) 
Si usa SSIS para ejecutar un procedimiento almacenado en una tarea SQL de ejecución y devolver un valor. Si el procedimiento devuelve cualquier valor además d...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos