Como hacer un select de un update? (MSSQL)

Iniciado por WHK, 19 Julio 2013, 17:37 PM

0 Miembros y 1 Visitante están viendo este tema.

WHK

Hola, tengo dos consultas sql que quiero migrar a una sola pero no tengo claro como hacerlo.

Necesito seleccionar el primer item de una tabla donde cuenta = 0 pero al mismo tiempo necesito que se actualize a 1 pero retornando la fila completa.

Es algo como esto:

[tabla] = select top(1) * from [tabla] where cuenta = 0 order by desc
update [tabla] set cuenta = 1 where [id] = [tabla].[id]

Desde .NET procesaré los datos de [tabla] sobre una grilla.

Por lo tanto necesito retornar valores aun haciendo un update. No importa si tengo que utilizar ";" o cualquier cosa menos una tabla temporal.

Alguien sabe como podría hacerlo en una sola consulta?

WHK

Resuelto :)

Código (csharp) [Seleccionar]
commandSQL = new SqlCommand(@"
DECLARE @id int;
SET @id = (select top(1) id from [table] where [x] = 0 order by id desc);
select * from [table] where id = @id;
update [table] set [x] = 20 where id = @id;
");

1mpuls0

#2
Una pregunta.

Por qué razón no optaste por hacer un procedure o dos query?, supongo que alguna razón debe haber.

Había encontrado algo parecido a tu resultado xD pero me ganaste.

http://www.codeproject.com/Questions/173387/Update-and-select-the-column-in-a-single-query-in

Saludos
abc

WHK

el problema de hacer dos querys es que tienes dos conexiones y mucha mas cantidad de lineas en .net , en cambio una sola query hace que el codigo se vea mas ordenado y con una sola conexión hacia la db sin tener que hacer bloqueos (costumbre de usar mysql).

hacer un procedure es practicamente lo mismo, tendría que hacer el procedimiento dos veces o hacer uno grande y despues llamarlo desde el código, al final es lo mismo pero con mas trabajo y con mas código.

Para que tanto lio si es posible hacer todo llamando una unica query directa?

Alguien me puede decir que beneficios tiene hacer un procedimiento almacenado v/s hacerlo directo en el código?

1mpuls0


De lo único que sé y me consta es lo siguiente:

Mayor capacidad de seguridad (cifrado y limitación de privilegios)
Código precompilado
Reutilización
Performance  ;D
Programación (básica)
Acepta parámetros y devuelve valores.
Multi-instrucciones.

La verdad es que veo más ventajas que desventajas.

Saludos.
abc

s00rk

Un SP igualmente en mi opinion no son del todo factible yo prefiero en mi BD tener solo la informacion, y desde mi aplicacion hacer el manejo de ella, y muchas veces he tenido que migrar entre gestores de bd mysql, mssql, postgres y los sp no son tan faciles de transladar so si son bastantes sp es mucho mas trabajo a hacer, igualmente la seguridad siempre dependera del programador.

La reutilizacion bastaria igualmente creandola como una funcion en nuestro codigo, el performance igualmente se me hace de forma mas sencilla acceder a codigo web que estar checando en la bd y hacer cambios en ella.

Aunque pues al final es como uno se sienta mas comodo.

WHK

Le estoy dando una vuelta a linq, se ve bueno pero al final igual usas la conexión sql, veré si sale mas ordenado y productivo que un procedimiento almacenado. Por ahora me quedo con la query pasada directamente sobre el código de .net a traves de un SqlCommand y parámetros.

Novlucker

Los SP están precompilados y se agregan al plan de ejecución de MSSQL, por lo cual son más performantes. Por otra parte, no se considera una buena práctica el tener las query directamente en el código de la aplicación.
En lo que respecta a la seguridad que se refiere Darhius, dado que recibes los valores como parámetros de los SP, ayudan a  mitigar los SQL Injections. Adicional a lo anterior, desde MSSQL podrías dar solamente permisos de ejecución de SP a un usuario, con lo cual no podría ejecutar un SELECT de ningún modo que no sea por medio de esos SP, sin tener en cuenta la posibilidad de cifrar su código.

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein