Convert VARCHAR() columns to NVARCHAR()
Posted
by ChrisD
on Geeks with Blogs
See other posts from Geeks with Blogs
or by ChrisD
Published on Wed, 26 Sep 2012 16:46:00 GMT
Indexed on
2012/09/26
21:38 UTC
Read the original article
Hit count: 288
We recently underwent an upgrade that required us to change our database columns from varchar to NVarchar, to support unicode characters.
Digging through the internet, I found a base script which I modified to handle reserved word table names, and maintain the NULL/NotNull constraint of the columns.
I Ran this script
use NWOperationalContent – Your Catalog Name here
GO
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 + ') '+
case syc.isnullable when 1 then ' NULL' ELSE ' NOT NULL' 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'
which produced a series of ALTER statements which I could then execute the tables. In some cases I had to drop indexes, alter the tables, and re-create the indexes. There might have been a better way to do that, but manually dropping them got the job done.
use NWMerchandisingContent
GO
ALTER TABLE Locale Drop Constraint PK_Locale
ALTER TABLE Country DROP CONSTRAINT PK_CountryGO
ALTER TABLE dbo.[Campaign] ALTER COLUMN [ActorKey] NVARCHAR(200) NOT NULL;
ALTER TABLE dbo.[BundleLocalization] ALTER COLUMN [Locale] NVARCHAR(8) NOT NULL;
ALTER TABLE dbo.[BundleLocalization] ALTER COLUMN [UnitOfmeasure] NVARCHAR(200) NULL;
ALTER TABLE dbo.[BundleLocalization] ALTER COLUMN [ActorKey] NVARCHAR(200) NOT NULL;
ALTER TABLE dbo.[BundleComponentLocalization] ALTER COLUMN [Locale] NVARCHAR(8) NOT NULL;
ALTER TABLE dbo.[BundleComponentLocalization] ALTER COLUMN [Imperative] NVARCHAR(MAX) NULL;
ALTER TABLE dbo.[BundleComponentLocalization] ALTER COLUMN [Instructions] NVARCHAR(MAX) NULL;
ALTER TABLE dbo.[BundleComponentLocalization] ALTER COLUMN [ActorKey] NVARCHAR(200) NOT NULL;
ALTER TABLE dbo.[BundleComponent] ALTER COLUMN [ActorKey] NVARCHAR(200) NOT NULL;
ALTER TABLE dbo.[Bundle] ALTER COLUMN [ActorKey] NVARCHAR(200) NOT NULL;
ALTER TABLE dbo.[Banner] ALTER COLUMN [ActorKey] NVARCHAR(200) NOT NULL;
ALTER TABLE dbo.[Video] ALTER COLUMN [Link] NVARCHAR(512) NOT NULL;
ALTER TABLE dbo.[Video] ALTER COLUMN [ActorKey] NVARCHAR(200) NOT NULL;
ALTER TABLE dbo.[ProductUsage] ALTER COLUMN [VideoLink] NVARCHAR(512) NOT NULL;
ALTER TABLE dbo.[ProductUsage] ALTER COLUMN [ActorKey] NVARCHAR(200) NOT NULL;
ALTER TABLE dbo.[Thumbnail] ALTER COLUMN [ActorKey] NVARCHAR(200) NOT NULL;
ALTER TABLE dbo.[SkuLocalization] ALTER COLUMN [Locale] NVARCHAR(8) NOT NULL;
ALTER TABLE dbo.[SkuLocalization] ALTER COLUMN [UnitOfMeasure] NVARCHAR(150) NOT NULL;
ALTER TABLE dbo.[SkuLocalization] ALTER COLUMN [SwatchColor] NVARCHAR(50) NOT NULL;etc..
GO
ALTER TABLE Locale ADD CONSTRAINT PK_Locale PRIMARY KEY (LocaleId)
ALTER TABLE Country ADD CONSTRAINT PK_Country PRIMARY KEY (CountryId)
Note that this alter is non-destructive to the data.
Hope this helps.
© Geeks with Blogs or respective owner