SQL Server - Gran Problemon

 
Vista:

Gran Problemon

Publicado por Romulo (16 intervenciones) el 06/11/2008 17:53:27
Tengo un gran problema, quiero actualizar una tabla pero necesito hacerlo dinamicamente que no se cuando voy a remplazar una columna u otra pongo un ejemplo de como quiero hacerlo
Esta es la forma tradicional y especificando el campo
update tabla1
set articuloid = 23
pero yo necesito hacer algo asi
if @moneda = 1
set @campo = 'articuloid' //articuloid es un campo de mi tabla el cual quiero actualizar por la condicion que traigo que la moneda es igual a 1
update tabla1
set @campo = 23

como hago para que mi variable @campo lo tome como si fuera articuloid ?
Agradezco a todas las personas que vean esto y me puedan ayudar a resolverlo

Saludos
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Gran Problemon

Publicado por pacopaz (131 intervenciones) el 06/11/2008 19:29:51
Puedes hacerlo de dos formas:
- La primera.
Puedes utilizar la sentencia case when, para determinar si el campo es o no el que se va a actualizar. Algo como esto:

update tabla1
set articuloid = case when @moneda = 1 then @valor else articuloid end,
campo2 = case when @moneda = 2 then @valor else campo2 end,
campo3 = case when @modena = 3 then ...
where ...

Esto haría que el valor tuviera que ser consistente con el tipo de datos de cada campo, es decir @valor deberá ser del mismo tipo que el campo. Quizás requeriría de una mayor parametrización y mucho código, pero al final resultaría en un mejor control.

- La segunda.
Que es lo que entiendo que pretendes hacer. Requerírías de la utilización del método exec. En si, se trata de generar una cadena con un comando sql y mandarlo llamar. Algo como esto:

if @moneda = 1
begin
set @campo = 'articuloId'
end
if @moneda = 2
begin
set @campo = 'campo2'
end
if...

exec('update tabla1 set ' + @campo + ' = ' + @valor + 'where ...')

Como verás, al final las sentencias if definirán a que campo te refieres, mientras que al final sólo sería un comando sql el que se ejecute. Las consideracioes aquí son que tanto @campo como @valor deben ser tipos varchar, aunque el valor que quieras insertar sea un entero. Esto, por que lo que concatenas es una cadena, así que si @valor es entero, obtendrás un error de ejecución. Con esto, el cuidado de como creas el exec, ya que si lo que quieres es poner una cadena, tendrás que ingresar, adicionalmente, las comillas, sea que modifiques @valor o el comando que mandas en el exec.

Espero que te sirva.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Gran Problemon

Publicado por Romulo (16 intervenciones) el 07/11/2008 18:46:27
gracias por tu gran ayuda fijate que estuve probando la segunda opcion y me funciona bien pero cuando no le pongo un where pero no entiendo porque ya no corre cuando le pongo esa condicion por ejemplo
exec('update tabla1 set ' + @campo + ' = ' + @x + 'where var1 = ' + @var2 )

Gracias por tremenda ayuda
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Gran Problemon

Publicado por pacopaz (131 intervenciones) el 07/11/2008 21:16:01
Pueden ser varias cosas. La más evidente es que te falta un espacio antes de where. Otra, que var1 sea un char o varchar y espere comillas antes y después del valor @var2.

Espero que te sirva.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Gran Problemon

Publicado por Romulo (16 intervenciones) el 10/11/2008 15:35:45
fijate que en el where si estoy trabajando un campo que es varchar pero como hago para mandarle la comilla ?
aqui te pongo mi ejemplo de como lo estoy trabajando

Y gracias por tu ayuda manin !!!!

declare @campo as char(10), @valor as int, @articulo as varchar(10)
select @campo = 'february'
select @valor = 100
select @articulo = '000741'
exec ('update productoxmes set ' + @campo + ' = ' + @valor + ' where articuloid = ' + @articulo )
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Gran Problemon

Publicado por Romulo (16 intervenciones) el 10/11/2008 16:10:48
vos fijate que estoy viendo que el where solo funciona cuando estoy condicionando un campo numerico en la tabla, pero si es un char o varchar EN LA TABLA ese no me lo toma con la condicion
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Gran Problemon

Publicado por pacopaz (131 intervenciones) el 10/11/2008 21:39:54
Este es el problema con esta implementación, que no es tan dinámica como debiera.
Puedes intentar con esto:

exec ('update productoxmes set ' + @campo + ' = ' + @valor + ' where articuloid = ''' + @articulo + '''')

Las dos comillas (') juntas, que no la doble comilla (") harán que se pase la comilla que requiere para que lo tome como caracter lo que le mandes.

Espero que te sirva.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Gran Problemon

Publicado por Romulo (16 intervenciones) el 14/11/2008 21:57:32
Que tal manin
Vos solo te queria agradecer grandemente toda tu ayuda probe como me dijiste esta ultima opcion y ahi funciono nitido, te escribi a tu correo personal de hot pero no se si lo leiste.
Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar