Automatizar truncado de tablas

01/12/2006 - 11:36 por Jesus Suarez | Informe spam
Hola a todos

como puedo hacer para borarr de forma automatica todas las talbas de una
base de datos que comienzen por la palabra sistemas_td, ya que tengo
problemas con las claves foraneas.

Preguntas similare

Leer las respuestas

#1 J.A. García Barceló
01/12/2006 - 11:55 | Informe spam
Una cosa es truncado de tablas y otra el borrado de tablas. Aqui tienes un
script que itera (con cursores) sobre las tablas like 'sistemas_td%' para
hacer un drop table
Esto te BORRA las tablas, que es diferente a truncarlas (borrar los datos de
las tablas). Si lo que quieres es truncar, utiliza TRUNCATE TABLE.


DECLARE @N nvarchar(2048),
@sql nvarchar(2048)

DECLARE MiCursor CURSOR LOCAL FOR
select name from sys.objects where name like 'sistemas_td%' and type='U'
order by name

OPEN MiCursor
FETCH NEXT FROM MiCursor INTO @N
WHILE (@@FETCH_STATUS <> -1) BEGIN
IF (@@FETCH_STATUS <> -2) BEGIN

SELECT @sql = N'DROP TABLE ' + QUOTENAME(@N)
PRINT @sql
efectivamente EJECUTAR el borrado de las tablas
END
FETCH NEXT FROM MiCursor INTO @N
END
CLOSE MiCursor
DEALLOCATE MiCursor


Pregunta para los acérrimos anticursores: Entiendo vuestra postura y yo
también intento no usarlos pero... ¿se podría hacer esto mismo sin cursores?

Un saludo.

J.A. García Barceló
http://jagbarcelo.blogspot.com

"Jesus Suarez" escribió en el mensaje
news:
Hola a todos

como puedo hacer para borarr de forma automatica todas las talbas de una
base de datos que comienzen por la palabra sistemas_td, ya que tengo
problemas con las claves foraneas.

Respuesta Responder a este mensaje
#2 Miguel egea
01/12/2006 - 12:14 | Informe spam
Si en 2005, concatenando en un varchar(max) (en 2000 no puedes garantizar
no pasarte de 8000 caracteres
/* codigo sin probar para nada */
Declare @v varchar(max)
set @v=''
select @v=@v+'DROP TABLE [' + schema_name+'].['+table_name+']' from
information_schema.tables where table_name like xxxx
exec(@v)

Pero tanto tu código como el mio tienen un problema, las dependencias, el
orden es muy importante para no violar fks, así que voy a ver si le doy una
vuelta y escribo algo para portalsql,

tengo un millón de cosas pendientes a ver si esta la cumplo

Saludos
Miguel Egea


"J.A. García Barceló" wrote in message
news:%
Una cosa es truncado de tablas y otra el borrado de tablas. Aqui tienes un
script que itera (con cursores) sobre las tablas like 'sistemas_td%' para
hacer un drop table
Esto te BORRA las tablas, que es diferente a truncarlas (borrar los datos
de las tablas). Si lo que quieres es truncar, utiliza TRUNCATE TABLE.


DECLARE @N nvarchar(2048),
@sql nvarchar(2048)

DECLARE MiCursor CURSOR LOCAL FOR
select name from sys.objects where name like 'sistemas_td%' and type='U'
order by name

OPEN MiCursor
FETCH NEXT FROM MiCursor INTO @N
WHILE (@@FETCH_STATUS <> -1) BEGIN
IF (@@FETCH_STATUS <> -2) BEGIN

SELECT @sql = N'DROP TABLE ' + QUOTENAME(@N)
PRINT @sql
efectivamente EJECUTAR el borrado de las tablas
END
FETCH NEXT FROM MiCursor INTO @N
END
CLOSE MiCursor
DEALLOCATE MiCursor


Pregunta para los acérrimos anticursores: Entiendo vuestra postura y yo
también intento no usarlos pero... ¿se podría hacer esto mismo sin
cursores?

Un saludo.

J.A. García Barceló
http://jagbarcelo.blogspot.com

"Jesus Suarez" escribió en el mensaje
news:
Hola a todos

como puedo hacer para borarr de forma automatica todas las talbas de una
base de datos que comienzen por la palabra sistemas_td, ya que tengo
problemas con las claves foraneas.





Respuesta Responder a este mensaje
#3 J.A. García Barceló
01/12/2006 - 12:24 | Informe spam
Para evitar tener que manejar con las FKs es mejor eliminarlas antes de
todas las tables a las que vaya a afectar el borrado. Se puede usar sp_fkeys
@fktable_name = N''' + @NombreDeTabla + '''' para recuperar esta informacion
y crear las instrucciones ALTER TABLE ... DROP CONSTRAINT ... antes de
intentar ejecutar los DROP TABLE

Un saludo.

J.A. García Barceló
http://jagbarcelo.blogspot.com

"Miguel egea" escribió en el mensaje
news:
Si en 2005, concatenando en un varchar(max) (en 2000 no puedes garantizar
no pasarte de 8000 caracteres
/* codigo sin probar para nada */
Declare @v varchar(max)
set @v=''
select @v=@v+'DROP TABLE [' + schema_name+'].['+table_name+']' from
information_schema.tables where table_name like xxxx
exec(@v)

Pero tanto tu código como el mio tienen un problema, las dependencias, el
orden es muy importante para no violar fks, así que voy a ver si le doy
una vuelta y escribo algo para portalsql,

tengo un millón de cosas pendientes a ver si esta la cumplo

Saludos
Miguel Egea


"J.A. García Barceló" wrote in message
news:%
Una cosa es truncado de tablas y otra el borrado de tablas. Aqui tienes
un script que itera (con cursores) sobre las tablas like 'sistemas_td%'
para hacer un drop table
Esto te BORRA las tablas, que es diferente a truncarlas (borrar los datos
de las tablas). Si lo que quieres es truncar, utiliza TRUNCATE TABLE.


DECLARE @N nvarchar(2048),
@sql nvarchar(2048)

DECLARE MiCursor CURSOR LOCAL FOR
select name from sys.objects where name like 'sistemas_td%' and type='U'
order by name

OPEN MiCursor
FETCH NEXT FROM MiCursor INTO @N
WHILE (@@FETCH_STATUS <> -1) BEGIN
IF (@@FETCH_STATUS <> -2) BEGIN

SELECT @sql = N'DROP TABLE ' + QUOTENAME(@N)
PRINT @sql
efectivamente EJECUTAR el borrado de las tablas
END
FETCH NEXT FROM MiCursor INTO @N
END
CLOSE MiCursor
DEALLOCATE MiCursor


Pregunta para los acérrimos anticursores: Entiendo vuestra postura y yo
también intento no usarlos pero... ¿se podría hacer esto mismo sin
cursores?

Un saludo.

J.A. García Barceló
http://jagbarcelo.blogspot.com

"Jesus Suarez" escribió en el mensaje
news:
Hola a todos

como puedo hacer para borarr de forma automatica todas las talbas de una
base de datos que comienzen por la palabra sistemas_td, ya que tengo
problemas con las claves foraneas.









Respuesta Responder a este mensaje
#4 J.A. García Barceló
01/12/2006 - 12:32 | Informe spam
Otra pregunta me surge...

Las ventajas de usar cursores, para este caso, en el que la eficiencia no se
va a ver comprometida (serán n tablas, las diferencias en rendimiento de
usar cursores a no usarlos sería una funcion lineal dependiente de n).
¿Merece la pena evitar usar cursores intentando tu sugerencia que, al final
ejecuta una única instrucción, que en cuanto falle cualquier tabla, te
debería hacer un rollback del borrado de todas ellas (supongo, ¿no?) ¿y si
tienes en cuenta que este código se va a ejecutar una única vez? ¿y si
tienes en cueenta la legibilidad del código (siempre es mas legible una
implementación iterativa)?

En definitiva ¿merece la pena siempre evitar los cursores a toda costa?

J.A. García Barceló
http://jagbarcelo.blogspot.com


"Miguel egea" escribió en el mensaje
news:
Si en 2005, concatenando en un varchar(max) (en 2000 no puedes garantizar
no pasarte de 8000 caracteres
/* codigo sin probar para nada */
Declare @v varchar(max)
set @v=''
select @v=@v+'DROP TABLE [' + schema_name+'].['+table_name+']' from
information_schema.tables where table_name like xxxx
exec(@v)

Pero tanto tu código como el mio tienen un problema, las dependencias, el
orden es muy importante para no violar fks, así que voy a ver si le doy
una vuelta y escribo algo para portalsql,

tengo un millón de cosas pendientes a ver si esta la cumplo

Saludos
Miguel Egea


"J.A. García Barceló" wrote in message
news:%
Una cosa es truncado de tablas y otra el borrado de tablas. Aqui tienes
un script que itera (con cursores) sobre las tablas like 'sistemas_td%'
para hacer un drop table
Esto te BORRA las tablas, que es diferente a truncarlas (borrar los datos
de las tablas). Si lo que quieres es truncar, utiliza TRUNCATE TABLE.


DECLARE @N nvarchar(2048),
@sql nvarchar(2048)

DECLARE MiCursor CURSOR LOCAL FOR
select name from sys.objects where name like 'sistemas_td%' and type='U'
order by name

OPEN MiCursor
FETCH NEXT FROM MiCursor INTO @N
WHILE (@@FETCH_STATUS <> -1) BEGIN
IF (@@FETCH_STATUS <> -2) BEGIN

SELECT @sql = N'DROP TABLE ' + QUOTENAME(@N)
PRINT @sql
efectivamente EJECUTAR el borrado de las tablas
END
FETCH NEXT FROM MiCursor INTO @N
END
CLOSE MiCursor
DEALLOCATE MiCursor


Pregunta para los acérrimos anticursores: Entiendo vuestra postura y yo
también intento no usarlos pero... ¿se podría hacer esto mismo sin
cursores?

Un saludo.

J.A. García Barceló
http://jagbarcelo.blogspot.com

"Jesus Suarez" escribió en el mensaje
news:
Hola a todos

como puedo hacer para borarr de forma automatica todas las talbas de una
base de datos que comienzen por la palabra sistemas_td, ya que tengo
problemas con las claves foraneas.









Respuesta Responder a este mensaje
#5 Miguel egea
01/12/2006 - 12:38 | Informe spam
Definitivamente no, es decir, no todos los cursores son el demonio, aunque
a mi me guste decir que el unico cursor bueno es el cursor muerto.

De hecho ni siquiera es verdad absoluta que lo que se puede hacer con
cursores se puede hacer sin ellos más rápido. Eladio y yo estuvimos en un
proyecto en que por la distribución de los datos, y las estadísticas, el
cursor, era más rápido que la instrucción equivalente, lamentablemente era
así porque la clave era un guid y la distribución era muy muy poco uniforme.

En cualquier caso, en el foro yo prefiero decir que todos son malos, y que
hay que evitarlos, por que es cierto que diciendo eso hierras menos que si
no lo dices y haces mejor papel a la gente que nos lee :)

Yo no quería borrar las constraints sino crear el script en el orden
correcto, porque las constraints si no hay que volver a crearlas o dejas la
BBDD echa un solar :)..

De todas formas, me encantan estas discusiones, nos enriquecen a todos IMO
:)


"J.A. García Barceló" wrote in message
news:
Otra pregunta me surge...

Las ventajas de usar cursores, para este caso, en el que la eficiencia no
se va a ver comprometida (serán n tablas, las diferencias en rendimiento
de usar cursores a no usarlos sería una funcion lineal dependiente de n).
¿Merece la pena evitar usar cursores intentando tu sugerencia que, al
final ejecuta una única instrucción, que en cuanto falle cualquier tabla,
te debería hacer un rollback del borrado de todas ellas (supongo, ¿no?) ¿y
si tienes en cuenta que este código se va a ejecutar una única vez? ¿y si
tienes en cueenta la legibilidad del código (siempre es mas legible una
implementación iterativa)?

En definitiva ¿merece la pena siempre evitar los cursores a toda costa?

J.A. García Barceló
http://jagbarcelo.blogspot.com


"Miguel egea" escribió en el mensaje
news:
Si en 2005, concatenando en un varchar(max) (en 2000 no puedes
garantizar no pasarte de 8000 caracteres
/* codigo sin probar para nada */
Declare @v varchar(max)
set @v=''
select @v=@v+'DROP TABLE [' + schema_name+'].['+table_name+']' from
information_schema.tables where table_name like xxxx
exec(@v)

Pero tanto tu código como el mio tienen un problema, las dependencias, el
orden es muy importante para no violar fks, así que voy a ver si le doy
una vuelta y escribo algo para portalsql,

tengo un millón de cosas pendientes a ver si esta la cumplo

Saludos
Miguel Egea


"J.A. García Barceló" wrote in message
news:%
Una cosa es truncado de tablas y otra el borrado de tablas. Aqui tienes
un script que itera (con cursores) sobre las tablas like 'sistemas_td%'
para hacer un drop table
Esto te BORRA las tablas, que es diferente a truncarlas (borrar los
datos de las tablas). Si lo que quieres es truncar, utiliza TRUNCATE
TABLE.


DECLARE @N nvarchar(2048),
@sql nvarchar(2048)

DECLARE MiCursor CURSOR LOCAL FOR
select name from sys.objects where name like 'sistemas_td%' and type='U'
order by name

OPEN MiCursor
FETCH NEXT FROM MiCursor INTO @N
WHILE (@@FETCH_STATUS <> -1) BEGIN
IF (@@FETCH_STATUS <> -2) BEGIN

SELECT @sql = N'DROP TABLE ' + QUOTENAME(@N)
PRINT @sql
efectivamente EJECUTAR el borrado de las tablas
END
FETCH NEXT FROM MiCursor INTO @N
END
CLOSE MiCursor
DEALLOCATE MiCursor


Pregunta para los acérrimos anticursores: Entiendo vuestra postura y yo
también intento no usarlos pero... ¿se podría hacer esto mismo sin
cursores?

Un saludo.

J.A. García Barceló
http://jagbarcelo.blogspot.com

"Jesus Suarez" escribió en el mensaje
news:
Hola a todos

como puedo hacer para borarr de forma automatica todas las talbas de
una base de datos que comienzen por la palabra sistemas_td, ya que
tengo problemas con las claves foraneas.













Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida