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;