none
Cambiar tipos de datos

    Question

  • Estimados.

    1.- En un SS2005 necesito cambiar todos los tipos de datos que estan en las tablas como smallint por int.

    2.- Luego de eso buscar en los SP las sentencias que tiene convert etc y aplicar un reemplazo de ello.

     

    Atte.

    CristianPM

    Friday, January 07, 2011 11:11 PM

Answers

  • Hola.

    No es por desanimarte, pero volviendo sobre esta cuestión, en caso de que el campo de tipo smallint forme parte de una foreign key, primary key, índice o en general alguna referencia ligada al esquema (vista indexada, función ligada al esquema, etc.), entonces primero debes eliminar la clave o restricción, luego modificar el campo y por último recrear de nuevo la restricción. Si es una foreign key has de modificar los campos en las dos tablas relacionadas antes de volver a crear la relación, ya que no puedes generar la integridad referencial si los tipos de datos son diferentes.

    En fin, que una complejidad adicional que tendrás que afrontar.

    Como contrapartida, te paso un script que te genera los "alter table":

    select Sentencia = 'ALTER TABLE [' + TABLE_SCHEMA + '].[' + TABLE_NAME + '] ALTER COLUMN [' + COLUMN_NAME + '] INT ' 
    + CASE IS_NULLABLE WHEN 'NO' THEN 'NOT NULL' ELSE 'NULL' END
    from INFORMATION_SCHEMA.COLUMNS where DATA_TYPE = 'smallint'
    


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/

    Saturday, January 08, 2011 4:55 PM
    Moderator
  • Creo que esta consulta te puede ayudar a encontrar procedimientos almacenados con la palabra convert.
    syscomments es una vista que contiene el codigo de procedimientos almacenados.
    Ahi esta incluido el nombre del procedimiento y el código:

    select * from Sys.syscomments
    where text like '%convert%'

    Ahora, teóricamente podrías cambiar smallint a int en todas las tablas, pero es relativamente complejo.
    Necesitarias en un cursor agregar information_schema.columns ,luego para cada columna smallint hacer un alter table dinámico, donde le pasas como parámetro el nombre de la tabla y el tipo de dato. Toma bastante tiempo hacer esto. Si tienes 10 tablitas, es mejor hacer a mano. Si son 200 tablas, puedes tratar con código.

    Más o menos la idea es esta:

    1. Con un cursor obtienes los datos de las columnas de tablas usando una consulta a information_schema.columns .
    2. Si la columna tiene smallint, hacer un alter dinámico...Execute ('alter table'+@nombretabla..... )
    Para más info de cursores:

    Para más info de alter table:



    MVP MCT MCTS Daniel Calbimonte

    http://elpaladintecnologico.blogspot.com
    Saturday, January 08, 2011 3:42 PM

All replies

  • Hola.

    Tendrás que realizar los cambios tabla por tabla. El paso 1 a lo mejor lo puedes medio automatizar usando sentencias que consulten tablas de metadatos, o al menos te permitirá ver qué cambios debes realizar (mira information_schema.columns), el segundo será totalmente manual.

    Existen aplicaciones que permiten realizar esta refactorización (como Visual Studio Team System for Database Professional), si cambias un campo de tipo, te localiza todos los sitios en los que está referenciado. Pero barrer todos los smallint y pasarlos a int no te lo hace.

     


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/

    Saturday, January 08, 2011 10:35 AM
    Moderator
  • Creo que esta consulta te puede ayudar a encontrar procedimientos almacenados con la palabra convert.
    syscomments es una vista que contiene el codigo de procedimientos almacenados.
    Ahi esta incluido el nombre del procedimiento y el código:

    select * from Sys.syscomments
    where text like '%convert%'

    Ahora, teóricamente podrías cambiar smallint a int en todas las tablas, pero es relativamente complejo.
    Necesitarias en un cursor agregar information_schema.columns ,luego para cada columna smallint hacer un alter table dinámico, donde le pasas como parámetro el nombre de la tabla y el tipo de dato. Toma bastante tiempo hacer esto. Si tienes 10 tablitas, es mejor hacer a mano. Si son 200 tablas, puedes tratar con código.

    Más o menos la idea es esta:

    1. Con un cursor obtienes los datos de las columnas de tablas usando una consulta a information_schema.columns .
    2. Si la columna tiene smallint, hacer un alter dinámico...Execute ('alter table'+@nombretabla..... )
    Para más info de cursores:

    Para más info de alter table:



    MVP MCT MCTS Daniel Calbimonte

    http://elpaladintecnologico.blogspot.com
    Saturday, January 08, 2011 3:42 PM
  • Hola.

    No es por desanimarte, pero volviendo sobre esta cuestión, en caso de que el campo de tipo smallint forme parte de una foreign key, primary key, índice o en general alguna referencia ligada al esquema (vista indexada, función ligada al esquema, etc.), entonces primero debes eliminar la clave o restricción, luego modificar el campo y por último recrear de nuevo la restricción. Si es una foreign key has de modificar los campos en las dos tablas relacionadas antes de volver a crear la relación, ya que no puedes generar la integridad referencial si los tipos de datos son diferentes.

    En fin, que una complejidad adicional que tendrás que afrontar.

    Como contrapartida, te paso un script que te genera los "alter table":

    select Sentencia = 'ALTER TABLE [' + TABLE_SCHEMA + '].[' + TABLE_NAME + '] ALTER COLUMN [' + COLUMN_NAME + '] INT ' 
    + CASE IS_NULLABLE WHEN 'NO' THEN 'NOT NULL' ELSE 'NULL' END
    from INFORMATION_SCHEMA.COLUMNS where DATA_TYPE = 'smallint'
    


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/

    Saturday, January 08, 2011 4:55 PM
    Moderator
  • Les agradezco muchisimos sus valiosos aportes.

     

    Vere como salgo del temita este.

     

    CristianPM (PENTA)

    Sunday, January 09, 2011 4:53 PM
  • Hablando de las restricciones, llaves foráneas. Una forma gráfica veloz de crear y borrar llaves foráneas, es usando los diagramas. En SQL Server Management Studio, vas a la base de datos y abres la opción Diagramas de base de datos o Database Diagrams. Agregas todas tus tablas en cuestión y ahí puedes borrar llaves foráneas, primarias o crearlas con unos pocos clicks.


    MVP MCT MCTS Daniel Calbimonte

    http://elpaladintecnologico.blogspot.com
    Monday, January 10, 2011 1:33 PM