Hacer update con condición dinámica

22/06/2007 - 19:49 por ghazarian.martin | Informe spam
tengo una tabla con varios campos, a la cual le quiero hacer un update

pero este update lo que tiene que hacer es cambiar los campos que
tengan el valor '1' por el valor '0'

por ej:
la tabla tiene los campos:

Campo1 ='1'
Campo2 ='2'
Campo3 ='2'
Campo4 ='1'

entonces en este caso campo1 y campo4 serían cambiados a 0
agradezco cualquier ayuda

Martín

Preguntas similare

Leer las respuestas

#6 Jesús López
25/06/2007 - 14:06 | Informe spam
La respuesta a tu pregunta es "no". La manera de simular eso es mediante
ejecución dinámica, de la cual ya te han puesto dos ejemplos.

A mi parecer, la mejor solución, al menos la más eficiente, es la que te dió
al principio jcac, que aunque laboriosa sólo requiere un único recorrido de
la tabla, mientras que la que te dió John J Bocachica requiere un recorrido
por cada campo.

Otra alternativa es usar el método de jcac, pero con ejecución dinámica para
construir la sentencia, de manera que no haya que escribir mucho código. En
SQL Server 2005 se podría hacer según este ejemplo:


CREATE TABLE TestTable
(
Id int PRIMARY KEY,
C1 int,
C2 int,
C3 int,
C4 int
)

INSERT INTO TestTable VALUES(1, 2, 3, 4, 5)
INSERT INTO TestTable VALUES(2, 1, 3, 4, 5)
INSERT INTO TestTable VALUES(3, 2, 1, 4, 5)
INSERT INTO TestTable VALUES(4, 2, 3, 1, 5)
INSERT INTO TestTable VALUES(5, 2, 3, 4, 1)

DECLARE @set nvarchar(max)
SET @set (SELECT name + ' = (CASE WHEN ' + name + ' = 1 THEN 0 ELSE ' + name + '
END),' AS [data()]
FROM sys.columns
WHERE object_id = OBJECT_ID('dbo.TestTable') AND
name LIKE 'C%'
FOR XML PATH(''))

SET @set = LEFT(@set, LEN(@set) - 1)
EXEC('UPDATE TestTable SET ' + @set)


Saludos:

Jesús López.
Solid Quality Mentors
www.solidq.com

"" escribió en el
mensaje news:
ok, agradezco las respuestas...terminé implementandolo con un cursor,
como decía alguien por ahí

Pero en si en mi pregunta había muchas dudas interesantes...que no
tuve tiempo de investigar...cuento algunas:

1- si se puede definir una varibale, de tipo "campos de la tabla", es
decir como dije más arriba:
declare Variable "Campos"

existe el tipo "Campos" ??, con esto quiero decir, que parado en un
sólo registro tengo una variable con todos los campos para poder
moverme con ella
Respuesta Responder a este mensaje
#7 ghazarian.martin
25/06/2007 - 19:24 | Informe spam
me pareció sumamente intereante el ejemplo de John J,
es al idea definir algo dentro de un "tipo columnas de tablas"
pero estoy en sql server 2000 y no me funcionó:
error:


Server: Msg 208, Level 16, State 1, Line 37
Invalid object name 'sys.Columns'.

es decir, no me reconoce sys.Columns
Respuesta Responder a este mensaje
#8 jcac
25/06/2007 - 19:59 | Informe spam
creo que en sql 200 es syscolumns

saludos

"" escribió en el
mensaje news:
me pareció sumamente intereante el ejemplo de John J,
es al idea definir algo dentro de un "tipo columnas de tablas"
pero estoy en sql server 2000 y no me funcionó:
error:


Server: Msg 208, Level 16, State 1, Line 37
Invalid object name 'sys.Columns'.

es decir, no me reconoce sys.Columns
Respuesta Responder a este mensaje
#9 Jesús López
25/06/2007 - 20:00 | Informe spam
No reconoce sys.columns porque es una vista de catálogo y las vistas de
catálogo son nuevas en SQL Server 2005. Tampoco funcionará FOR XML PATH que
es nuevo también. Y tampoco funcionará varchar(max) ni asignar el resultado
de FOR XML a una variable.

Esto sí que funcionará en SQL 2000:

USE TestDB

IF OBJECT_ID('dbo.TestTable') IS NOT NULL
DROP TABLE TestTable

CREATE TABLE TestTable
(
Id int PRIMARY KEY,
C1 int,
C2 int,
C3 int,
C4 int
)


INSERT INTO TestTable VALUES(1, 2, 3, 4, 5)
INSERT INTO TestTable VALUES(2, 1, 3, 4, 5)
INSERT INTO TestTable VALUES(3, 2, 1, 4, 5)
INSERT INTO TestTable VALUES(4, 2, 3, 1, 5)
INSERT INTO TestTable VALUES(5, 2, 3, 4, 1)


DECLARE @sql varchar(8000)
DECLARE @ColumnName varchar(128)

DECLARE cColumns CURSOR FAST_FORWARD
FOR SELECT name FROM syscolumns
WHERE id = OBJECT_ID('dbo.TestTable') AND name LIKE 'C%'
OPEN cColumns
FETCH cColumns INTO @ColumnName


WHILE @@FETCH_STATUS = 0
BEGIN
IF @sql IS NULL
BEGIN
SET @sql = 'UPDATE dbo.TestTable SET ' +
@ColumnName + ' = (CASE WHEN ' +
@ColumnName + ' = 1 THEN 0 ELSE ' +
@ColumnName + ' END)'
END
ELSE
BEGIN
SET @sql = @sql + ', ' +
@ColumnName + ' = (CASE WHEN ' +
@ColumnName + ' = 1 THEN 0 ELSE ' +
@ColumnName + ' END)'
END
FETCH cColumns INTO @ColumnName
END
CLOSE cColumns
DEALLOCATE cColumns
EXEC (@sql)


SELECT * FROM TestTable

Saludos:

Jesús López.
Solid Quality Mentors
www.solidq.com

"" escribió en el
mensaje news:
me pareció sumamente intereante el ejemplo de John J,
es al idea definir algo dentro de un "tipo columnas de tablas"
pero estoy en sql server 2000 y no me funcionó:
error:


Server: Msg 208, Level 16, State 1, Line 37
Invalid object name 'sys.Columns'.

es decir, no me reconoce sys.Columns
Respuesta Responder a este mensaje
#10 ghazarian.martin
26/06/2007 - 21:05 | Informe spam
1 millón de gracias, el ejemplo me funcionó perfecto.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida