length - SQL Server-secuencia de comandos para actualizar las columnas de la base de datos de varchar a nvarchar si aún no es nvarchar
tipos de datos sql server (4)
El problema con la respuesta de Josef es que cambiaría los campos NOT NULL
a NULL
después de ejecutar las consultas. La siguiente manipulación lo corrige:
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 la respuesta de Igor
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 admitir son SQL Server 2000, 2005 y 2008.
La siguiente consulta debería proporcionarle 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
Puede ejecutar el siguiente script que le dará un conjunto de comandos ALTER:
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''
Sin embargo, hay un par de advertencias rápidas para ti.
- Esto solo hará tablas. Querrá escanear todos sus sprocs y funciones para asegurarse de que también se cambien a
NVARCHAR
. - Si tiene un
VARCHAR
> 4000, deberá modificarlo para que seaNVARCHAR(MAX)
Pero esos deben ser fácilmente factibles con esta plantilla.
Si desea que esto se ejecute automágicamente, puede configurarlo en una cláusula WHILE
.
Se solucionó el problema de espacio y el esquema agregado
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''