Foro de elhacker.net

Programación => Bases de Datos => Mensaje iniciado por: WHK en 19 Julio 2013, 17:37 pm



Título: Como hacer un select de un update? (MSSQL)
Publicado por: WHK en 19 Julio 2013, 17:37 pm
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?


Título: Re: Como hacer un select de un update? (MSSQL)
Publicado por: WHK en 19 Julio 2013, 20:12 pm
Resuelto :)

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


Título: Re: Como hacer un select de un update? (MSSQL)
Publicado por: 1mpuls0 en 19 Julio 2013, 20:37 pm
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


Título: Re: Como hacer un select de un update? (MSSQL)
Publicado por: WHK en 22 Julio 2013, 15:43 pm
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?


Título: Re: Como hacer un select de un update? (MSSQL)
Publicado por: 1mpuls0 en 22 Julio 2013, 18:06 pm

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.


Título: Re: Como hacer un select de un update? (MSSQL)
Publicado por: s00rk en 25 Julio 2013, 06:07 am
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.


Título: Re: Como hacer un select de un update? (MSSQL)
Publicado por: WHK en 25 Julio 2013, 15:36 pm
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.


Título: Re: Como hacer un select de un update? (MSSQL)
Publicado por: Novlucker en 25 Julio 2013, 15:54 pm
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