2008-10-07 44 views

回答

2

下面的查詢應該得到你所需要的:

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

您可以運行下面的腳本,這將給你一套ALTER的命令:

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' 

有,但是,一對夫婦的快速注意事項你。

  1. 這隻會做表格。您需要掃描所有的sprocs和函數,以確保它們也更改爲NVARCHAR
  2. 如果你有一個VARCHAR> 4000,您將需要修改它是NVARCHAR(MAX)

但這些應與此模板容易可行。

如果您希望自動運行,您可以將其設置在WHILE子句中。

+0

這美麗的工作對我來說。偉大的小腳本! – DanM 2009-03-10 14:09:56

2

修正的空間問題,添加的架構

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

與約瑟夫的回答的問題是,它會執行查詢後更改NOT NULL領域NULL。下面的操作解決它:

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 

Igor's answer

相關問題