Estoy en una situación en la que debo actualizar una estructura de base de datos existente de varchar a nvarchar utilizando un script. Como este script se ejecuta cada vez que se ejecuta una aplicación de configuración, prefiero determinar si una columna ya se ha cambiado a nvarchar y no realizar un alter en la tabla. Las bases de datos que debo de apoyo son de SQL Server 2000, 2005 y 2008.Servidor SQL - script para actualizar las columnas de la base de datos desde varchar a nvarchar si aún no está nvarchar
9
A
Respuesta
2
La siguiente consulta debe recibir todo lo que necesita:
IF EXISTS
(SELECT *
FROM sysobjects syo
JOIN syscolumns syc ON
syc.id = syo.id
JOIN systypes syt ON
syt.xtype = syc.xtype
WHERE
syt.name = 'nvarchar' AND
syo.name = 'MY TABLE NAME' AND
syc.name = 'MY COLUMN NAME')
BEGIN
ALTER ...
END
26
puede ejecutar la siguiente secuencia de comandos que le dará un conjunto de ALTER comandos:
SELECT 'ALTER TABLE ' + isnull(schema_name(syo.id), 'dbo') + '.' + syo.name
+ ' ALTER COLUMN ' + syc.name + ' NVARCHAR(' + case syc.length when -1 then 'MAX'
ELSE convert(nvarchar(10),syc.length) end + ');'
FROM sysobjects syo
JOIN syscolumns syc ON
syc.id = syo.id
JOIN systypes syt ON
syt.xtype = syc.xtype
WHERE
syt.name = 'varchar'
and syo.xtype='U'
Hay, sin embargo, un par de advertencias rápida para usted.
- Esto solo hará las tablas. Querrá escanear todos sus sprocs y funciones para asegurarse de que también se cambien a
NVARCHAR
. - Si usted tiene un
VARCHAR
> 4000 tendrá que modificarlo para que seaNVARCHAR(MAX)
Pero los que debe ser fácilmente factible con esta plantilla.
Si desea que esto se ejecute automágicamente puede configurarlo en una cláusula WHILE
.
2
ha solucionado el problema de espacio y ha añadido esquema
SELECT 'ALTER TABLE [' + isnull(schema_name(syo.object_id), sysc.name) + '].[' + syo.name
+ '] ALTER COLUMN ' + syc.name + ' NVARCHAR(' + case syc.max_length when -1 then 'MAX'
ELSE convert(nvarchar(10),syc.max_length) end + ');'
FROM sys.objects syo
JOIN sys.columns syc ON
syc.object_id= syo.object_id
JOIN sys.types syt ON
syt.system_type_id = syc.system_type_id
JOIN sys.schemas sysc ON
syo.schema_id=sysc.schema_id
WHERE
syt.name = 'varchar'
and syo.type='U'
4
El problema con la respuesta de Josef es que cambiaría NOT NULL
campos a NULL
después de ejecutar las consultas. La siguiente manipulación de la fija:
SELECT cmd = 'alter table [' + c.table_schema + '].[' + c.table_name
+ '] alter column [' + c.column_name + '] nvarchar('
+CASE WHEN CHARACTER_MAXIMUM_LENGTH<=4000
THEN CAST(CHARACTER_MAXIMUM_LENGTH as varchar(10)) ELSE 'max' END+')'
+ CASE WHEN IS_NULLABLE='NO' THEN ' NOT NULL' ELSE '' END,*
FROM information_schema.columns c
WHERE c.data_type='varchar'
ORDER BY CHARACTER_MAXIMUM_LENGTH desc
Créditos a Igor's answer
Cuestiones relacionadas
- 1. Determinar el contenido varchar en columnas nvarchar
- 2. Conversión de nvarchar (4000) a nvarchar (max)
- 3. (NO) NULO para columnas NVARCHAR
- 4. Asignación a varchar y nvarchar en hibernación
- 5. Unicode- VARCHAR y NVARCHAR
- 6. varchar o nvarchar
- 7. ¿Cómo cambiar cada columna nvarchar a varchar?
- 8. Problema nvarchar de SQL a SQL
- 9. Cambiar el tipo de datos varchar a nvarchar en la base de datos existente de SQL Server 2005. ¿Cualquier problema?
- 10. Consulta SQL para convertir nvarchar a int
- 11. ¿Cuándo debemos usar NVARCHAR/NCHAR en lugar de VARCHAR/CHAR en SQL Server?
- 12. nvarchar (max) versus NText
- 13. ¿Existe alguna razón por la que no deba usar NVARCHAR en el servidor Sql?
- 14. sql server 2005 - exportar datos nvarchar (max)
- 15. Cambiar una columna de datos de varchar (max) a nvarchar (max) en SQL Server 2008
- 16. diferencia entre VARCHAR NVARCHAR en SQLite
- 17. Convertir nvarchar a bigint en el servidor SQL 2008
- 18. ¿Cuál es el punto de COLLATIONS para columnas nvarchar (Unicode)?
- 19. Anulación de NHibernate con fluidez para cadenas de texto largas nvarchar (MAX) no nvarchar (255)
- 20. ¿El nvarchar siempre ocupa el doble de espacio que varchar?
- 21. ¿Qué es el equivalente de PostgreSQL a SQL Server NVARCHAR?
- 22. Rendimiento SQL: ¿Hay algún golpe de rendimiento usando NVarchar (MAX) en lugar de NVarChar (200)
- 23. nvarchar (256) ....?
- 24. Error que convierte el tipo de datos nvarchar a int
- 25. cadena de Ajuste que debe tipo SQL de "varchar" en lugar de "nvarchar"
- 26. nchar vs nvarchar rendimiento
- 27. NVARCHAR (?) Para direcciones de correo electrónico en SQL Server
- 28. error de SQL dinámico nvarchar convertir a int
- 29. Intercalación de molde de variables nvarchar en t-sql
- 30. Tamaño de las columnas varchar
Esto funcionó muy bien para mí. ¡Un pequeño guión! – DanM
Tenga cuidado con esto porque obtendrá todos los valores predeterminados para una nueva columna. Por ejemplo, un varchar no nulo se creará como un nvarchar nullable. –