tipos length datos sql-server alter-table

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.

  1. Esto solo hará tablas. Querrá escanear todos sus sprocs y funciones para asegurarse de que también se cambien a NVARCHAR .
  2. Si tiene un VARCHAR > 4000, deberá modificarlo para que sea NVARCHAR(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''