Datenbank auf Unicode umstellen

Wenn eine SQL Server Datenbank auf Unicode umgestellt werden soll, muss dies über die Umstellung des Datentyps der Tabellenspalten von VARCHAR auf NVARCHAR erfolgen. Man kann sich die entsprechenden Spalten von Hand raussuchen und die entsprechenden ALTER TABLE x ALTER COLUMN y NVARCHAR(z) Kommandos zusammenschreiben, man kann aber auch das nachfolgende Skript verwenden, um sich die Arbeit etwas zu erleichtern...

Bevor die Spalten umgebaut werden, müssen etwaige Constraints deaktiviert und anschließend wieder aktiviert werden. Dies kann (je nach Umfang) über das SQL Server Management Studio (Script Constraint as --> DROP And CREATE To --> New Query Editor Window) erfolgen - oder man baut sich dafür ein Skript.

-- Konvertiert alle Spalten einer Tabelle von VARCHAR(size) zu NVARCHAR(size)
USE [ReplaceDatabaseName] -- DB-Namen entsprechend anpassen
GO
 
DECLARE @CursorColumns CURSOR;
DECLARE @ModifyTableName varchar(250);
DECLARE @StmtModifyColumn varchar(max);
DECLARE @StmtRebuildTable varchar(max);
DECLARE @PreviewOnly BIT = 1; -- 1 für nur Ausgabe der Statements; 0 für Ausführung der Statements
SET @ModifyTableName = 'ReplaceTableName'; -- Tabellennamen entsprechend anpassen
 
BEGIN
  -- Modify Column Statement generieren
  SET @CursorColumns = CURSOR FOR
  SELECT 
    'ALTER TABLE ' + @ModifyTableName + ' ALTER COLUMN ' +
    c.name + ' NVARCHAR(' +
    CASE c.max_length
      WHEN -1 THEN 'max'
      ELSE CAST(c.max_length AS VARCHAR)
    END + ') ' +
    CASE c.is_nullable 
      WHEN 0 THEN 'NOT NULL'
      WHEN 1 THEN ''
    END +
    ';'
  FROM    
    sys.columns c
  INNER JOIN 
    sys.types t ON c.user_type_id = t.user_type_id
  WHERE
    c.object_id = OBJECT_ID(@ModifyTableName) AND 
    UPPER(t.Name) = 'VARCHAR';
 
  OPEN @CursorColumns;
  -- Modify Column Statement anzeigen oder ausführen
  FETCH NEXT FROM @CursorColumns INTO @StmtModifyColumn;
  WHILE @@FETCH_STATUS = 0
  BEGIN
    IF @PreviewOnly = 1
      PRINT @StmtModifyColumn;
    ELSE
      EXEC (@StmtModifyColumn);
    FETCH NEXT FROM @CursorColumns INTO @StmtModifyColumn;
  END;
 
  CLOSE @CursorColumns;  
  DEALLOCATE @CursorColumns;
 
  -- Table Rebuild
  SET @StmtRebuildTable = 'ALTER TABLE ' + @ModifyTableName + ' REBUILD;';
  IF @PreviewOnly = 1
    PRINT @StmtRebuildTable;
  ELSE
    EXEC (@StmtRebuildTable);
END;