2008-10-07 9 views
9

Jestem w sytuacji, w której muszę zaktualizować istniejącą strukturę bazy danych z varchar do nvarchar za pomocą skryptu. Ponieważ ten skrypt jest uruchamiany za każdym razem, gdy uruchamiana jest aplikacja konfiguracyjna, wolałabym określić, czy kolumna została już zmieniona na nvarchar i czy nie dokonała zmiany w tabeli. Bazy danych, które muszą Popieram to SQL Server 2000, 2005 i 2008.Serwer SQL - skrypt do aktualizacji kolumn bazy danych z varchar do nvarchar, jeśli jeszcze nie jest nvarchar

Odpowiedz

2

Następująca kwerenda powinien dostać to, czego potrzebujesz:

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

można uruchomić następujący skrypt, który da ci zestaw ALTER polecenia:

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' 

Istnieje jednak kilka szybkich Ostrzeżenia dla Ciebie.

  1. Spowoduje to tylko tabele. Będziesz chciał skanować wszystkie sprocs i funkcje, aby upewnić się, że są one również zmienione na NVARCHAR.
  2. Jeśli masz VARCHAR> 4000 trzeba będzie zmodyfikować go mieć NVARCHAR(MAX)

Ale te powinny być łatwo wykonalne z tego szablonu.

Jeśli chcesz, aby to działało automagicznie, możesz ustawić je w klauzuli WHILE.

+0

To działało pięknie do mnie. Świetny mały skrypt! – DanM

+4

Uważaj, ponieważ otrzymasz wszystkie domyślne wartości dla nowej kolumny. Np. Niedotykalny varchar zostanie utworzony jako nvarchar nullable. –

2

Naprawiono problem przestrzeni i dodaje schemat

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

Problem z odpowiedzią Josef jest to, że byłoby to zmienić NOT NULL pola do NULL po wykonaniu zapytania. Poniższy manipulacja rozwiązuje go:

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 

kuponów do Igor's answer

Powiązane problemy