Tengo una base de datos (Sql Server 2005) donde hay docenas de tablas, cada una de las cuales tiene varias columnas (en promedio 10-20) con el tipo de datos establecido en nvarchar (max) Este es un rendimiento absolutamente negativo (algunas de estas columnas se utilizan para uniones y algunas de las tablas tienen más de 100K filas). Me gustaría cambiar todas estas columnas para que sean varchar (250). ¿Cuál sería la mejor manera de automatizar esto? (Podría usar Management Studio, o podría crear una utilidad para realizar esto a través de un sitio web ASP.net que tenga acceso a la base de datos, lo que sea más fácil).Cómo cambiar todas las columnas Sql de un tipo de datos en otro
Respuesta
Aquí hay un guión de trabajo que utiliza INFORMATION_SCHEMA.COLUMNS
para encontrar todos los *varchar(max)
columnas y los convierte en varchar(255)
:
declare @schema nvarchar(255)
declare @table nvarchar(255)
declare @col nvarchar(255)
declare @dtype nvarchar(255)
declare @sql nvarchar(max)
declare maxcols cursor for
select
c.TABLE_SCHEMA,
c.TABLE_NAME,
c.COLUMN_NAME,
c.DATA_TYPE
from
INFORMATION_SCHEMA.COLUMNS c
inner join INFORMATION_SCHEMA.TABLES t on
c.TABLE_CATALOG = t.TABLE_CATALOG
and c.TABLE_SCHEMA = t.TABLE_SCHEMA
and c.TABLE_NAME = t.TABLE_NAME
and t.TABLE_TYPE = 'BASE TABLE'
where
c.DATA_TYPE like '%varchar'
and c.CHARACTER_MAXIMUM_LENGTH = -1
open maxcols
fetch next from maxcols into @schema, @table, @col, @dtype
while @@FETCH_STATUS = 0
begin
set @sql = 'alter table [' + @schema + '].[' + @table +
'] alter column [' + @col + '] ' + @dtype + '(255)'
exec sp_executesql @sql
fetch next from maxcols into @schema, @table, @col, @dtype
end
close maxcols
deallocate maxcols
Este es el único uso de cursores que alguna vez condonar, pero es una buena. Esencialmente, encuentra todos los *varchar(max)
, construye la declaración alter
y luego la ejecuta usando sp_executesql
.
¡Disfrútalo!
Creo que la mejor manera de hacer esta tarea es generar script para la base de datos actual y luego reemplazar nvarchar (max) con varchar (250) en el archivo de texto, y luego crear la nueva base de datos. después de eso, use las utilidades de importación/exportación para transferir los datos a la nueva base de datos.
Esto no funciona - SSIS devolverá un mensaje de error que indica que los metadatos de la columna no coinciden entre las tablas de origen y de destino –
Usted puede encontrar fácilmente, usando:
select 'alter table ' + quotename(o.name) + ' alter column ' + quotename(c.name) + ' varchar(250); '
from sys.columns c
join
sys.objects o
on o.object_id = c.object_id
where o.type = 'U'
and c.user_type_id = 231
and c.max_length = -1
Así que ahora sólo agarrar los resultados de la consulta y ejecutarlo.
Rob
También podría valer la pena mencionar ... si pone declare @qry nvarchar (max), y seleccione @qry = (.... para xml path ('')); exec sp_executesql @qry; - Puedes hacerlo todo en un solo paso. El ... es la consulta actual que tengo. Pero entonces no puedes 'sanidad' comprobarlo tan bien. –
¿Necesita tener en cuenta la invalidación de columna? ¿Esto alterará las columnas para ser anulables porque no especifica de ninguna manera? –
- 1. Buscar todas las columnas de un cierto tipo en todas las tablas en una base de datos SQL Server
- 2. Cómo imprimir todas las columnas en un lector de datos
- 3. Cambiar la precisión de todas las columnas decimales en cada tabla en la base de datos
- 4. Cómo cambiar las columnas de DataTop orden
- 5. R cambiar todas las columnas de tipo de factor a numérico
- 6. Seleccionar todas las columnas de todas las tablas de SQL Server 2008
- 7. ¿Cómo obtengo las clases de todas las columnas en un marco de datos?
- 8. Datos de salida de todas las columnas en un marco de datos en pandas
- 9. Prefijo de todas las columnas de instrucción T-SQL
- 10. Todas las columnas en MongoDB
- 11. cómo puedo recorrer todas las columnas de OracleDataReader
- 12. ¿Cómo eliminar todas las columnas de JTable?
- 13. Rails 3 Devolución de todas las columnas de un join
- 14. cómo trazar todas las columnas de un marco de datos en R
- 15. Obtenga todas las tablas y todas las columnas de una base de datos odbc
- 16. Obtener todas las columnas de todas las tablas MySQL
- 17. SQL Server: Cómo realizar Rtrim en todas las columnas varchar de una tabla
- 18. Zend selecciona todas las columnas
- 19. Buscar todas las columnas de una tabla para un valor?
- 20. ¿Cómo puedo listar todas las tablas en una base de datos con Squirrel SQL?
- 21. Devuelve todas las columnas de una tabla SQLite en Android
- 22. Seleccionar todas las columnas de todas las tablas de unirse a + LINQ unen
- 23. ¿Cómo puedo enumerar todas las columnas de una tabla?
- 24. ¿Cómo cambiar todos los valores NULL de columna de tipo de bit a falso en todas las bases de datos en MSSQL?
- 25. SQL: cuente el número de columnas en todas las tablas, excepto las vistas
- 26. Cómo vaciar todas las filas de todas las tablas en mysql (en sql)
- 27. SQL: elimine todos los datos de todas las tablas disponibles
- 28. Buscar todas las referencias a un objeto en una base de datos SQL Server
- 29. Quiero valor específico de búsqueda en todas las columnas de todas las tablas en Oracle 11g
- 30. getschema ("Columnas") + devolver Tipo de datos;
Esto no funciona a la perfección ya que también trae columnas desde las vistas –
@Yaakov: ¡Solucionado! – Eric
Ahora, ¿cómo eliminar las restricciones y volver a ponerlas al hacer esto, ya que no podemos alterar las cols con una restricción en su lugar? – JosephK