
NO CURSOR-SOLO TSQL
Publicado por DALSOM (195 intervenciones) el 11/05/2009 20:02:49
HOLA A TODOS, NUEVAMENTE.
A VER, HE ESTADO INVESTIGANDO ESTA MAÑANA, Y VI MUCHAS COSAS QUE ME AYUDARON, Y ENTRE OTRAS ME TIENEN PENSANDO EN UNA NUEVA FORMA.
A VER COMO HARIAN ESTO SIN UN FETCH. TENGO UNA TABLA DE n CAMPOS char() Y varchar(), MUCHOS COMO PARA DIGITAR UN UPDATE POR CADA CAMPO.
TENGO QUE ACTUALIZAR TODOS LOS CAMPOS QUE SEAN char, Y CUYO VALOR SEA UN ASTERISCO (*) A ESPACIOS EN BLANCO, EN TODAS LAS FILAS.
PARECE SENCILLO. PERO CUANDO LOS CAMPOS DE UNA TABLA SON 50, 100, o 200 ES DIFERENTE. POR LO QUE PENSE EN DOS SOLUCIONES:
1. DIGITAR UPDATES PARA CADA CAMPO, QUE ES MUY TEDIOSO.
2.SUBIR LOS NOMBRES DE CAMPOS DE TIPO CHAR A UN CURSOR, Y LUEGO HACER UN CICLO fetch_status DONDE CONSTRUYO EL UPDATE PARA CADA CAMPO, Y LOS EJECUTO CON exec (<comando>) QUE SON MUCHO MENOS LINEAS DE CODIGO (PARECIA LO IDEAL).
PERO ENTONCES VI UN COMENTARIO DE ALGUIEN QUE PREGUNTO SOBRE LOS CURSORES, Y VARIOS LE RESPONDIERON QUE NO SON RECOMENDABLES, QUE DEBERIA HACERLO CON TSQL, YA QUE CON EL CURSOR BAJA MUCHO EL PERFORMANCE Y PUEDE COLGARSE EL SERVIDOR.
COMO PODRIA HACER UN UPDATE PARA QUE SI EL VALOR DE CADA CAMPO EN CADA FILA ES UN ASTERISCO, LO SUSTITUYA POR EL VALOR DESEADO, EN CADA CAMPO DE CADA FILA? MAS GRAFICAMENTE :
TablaN
F1 F2 F3 F4 .... Fn
1 AA * BB * .... Y1
2 * X1 * DD .... *
3 C3 DL DS K3 .... *
DE LA FORMA 1 SERIA ASI :
update tablaN set f1 = ' ' where F1 = '*'
update tablaN set f2 = ' ' where F2 = '*'
update tablaN set f3 = ' ' where F3 = '*'
....
update tablaN set fn = ' ' where Fn = '*'
DE LA FORMA 2 SERIA CON UN :
Declare cursor curFields as
select column_name from tempdb.INFORMATION_SCHEMA.columns
where TABLE_NAME = 'Tablas' and data_type in('char','varchar')
open cursor curfields
fetch next into @cfn -- un char(128) como maximo nombre de campo.
do while @fetch_status = 0
begin
exec ('update tablaN set ' + rtrim(@table_name) + '= space(0)
where ' + rtrim(@table_name) + ' =' + ''' + '*' + ''' )
end
deallocate curfield
close curfield
QUE HARIA BAJAR ENORMEMENTE EL PERFORMANCE DEL SERVIDOR.
YA QUE LO EXPLIQUE LO MEJOR QUE PUDE, QUE OTRA OPCION ME RECOMIENDAN?
DE ANTEMANO, GRACIAS POR LEER MI EXTENSA EXPLICACION.
ACEPTO CUALQUIER SUGERENCIA.
GRACIAS.
DALSOM
REP. DOM.
A VER, HE ESTADO INVESTIGANDO ESTA MAÑANA, Y VI MUCHAS COSAS QUE ME AYUDARON, Y ENTRE OTRAS ME TIENEN PENSANDO EN UNA NUEVA FORMA.
A VER COMO HARIAN ESTO SIN UN FETCH. TENGO UNA TABLA DE n CAMPOS char() Y varchar(), MUCHOS COMO PARA DIGITAR UN UPDATE POR CADA CAMPO.
TENGO QUE ACTUALIZAR TODOS LOS CAMPOS QUE SEAN char, Y CUYO VALOR SEA UN ASTERISCO (*) A ESPACIOS EN BLANCO, EN TODAS LAS FILAS.
PARECE SENCILLO. PERO CUANDO LOS CAMPOS DE UNA TABLA SON 50, 100, o 200 ES DIFERENTE. POR LO QUE PENSE EN DOS SOLUCIONES:
1. DIGITAR UPDATES PARA CADA CAMPO, QUE ES MUY TEDIOSO.
2.SUBIR LOS NOMBRES DE CAMPOS DE TIPO CHAR A UN CURSOR, Y LUEGO HACER UN CICLO fetch_status DONDE CONSTRUYO EL UPDATE PARA CADA CAMPO, Y LOS EJECUTO CON exec (<comando>) QUE SON MUCHO MENOS LINEAS DE CODIGO (PARECIA LO IDEAL).
PERO ENTONCES VI UN COMENTARIO DE ALGUIEN QUE PREGUNTO SOBRE LOS CURSORES, Y VARIOS LE RESPONDIERON QUE NO SON RECOMENDABLES, QUE DEBERIA HACERLO CON TSQL, YA QUE CON EL CURSOR BAJA MUCHO EL PERFORMANCE Y PUEDE COLGARSE EL SERVIDOR.
COMO PODRIA HACER UN UPDATE PARA QUE SI EL VALOR DE CADA CAMPO EN CADA FILA ES UN ASTERISCO, LO SUSTITUYA POR EL VALOR DESEADO, EN CADA CAMPO DE CADA FILA? MAS GRAFICAMENTE :
TablaN
F1 F2 F3 F4 .... Fn
1 AA * BB * .... Y1
2 * X1 * DD .... *
3 C3 DL DS K3 .... *
DE LA FORMA 1 SERIA ASI :
update tablaN set f1 = ' ' where F1 = '*'
update tablaN set f2 = ' ' where F2 = '*'
update tablaN set f3 = ' ' where F3 = '*'
....
update tablaN set fn = ' ' where Fn = '*'
DE LA FORMA 2 SERIA CON UN :
Declare cursor curFields as
select column_name from tempdb.INFORMATION_SCHEMA.columns
where TABLE_NAME = 'Tablas' and data_type in('char','varchar')
open cursor curfields
fetch next into @cfn -- un char(128) como maximo nombre de campo.
do while @fetch_status = 0
begin
exec ('update tablaN set ' + rtrim(@table_name) + '= space(0)
where ' + rtrim(@table_name) + ' =' + ''' + '*' + ''' )
end
deallocate curfield
close curfield
QUE HARIA BAJAR ENORMEMENTE EL PERFORMANCE DEL SERVIDOR.
YA QUE LO EXPLIQUE LO MEJOR QUE PUDE, QUE OTRA OPCION ME RECOMIENDAN?
DE ANTEMANO, GRACIAS POR LEER MI EXTENSA EXPLICACION.
ACEPTO CUALQUIER SUGERENCIA.
GRACIAS.
DALSOM
REP. DOM.
Valora esta pregunta


0