2008-10-07 12 views
9

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

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.

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

+0

Esto funcionó muy bien para mí. ¡Un pequeño guión! – DanM

+4

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. –

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