2015-06-11 66 views
0

我的數據庫中有大約200列,其中VARCHAR類型無法存儲盧比符號。現在我必須將所有列的數據類型從VARCHAR更改爲NVARCHAR將所有VARCHAR列更改爲NVARCHAR

任何人都可以告訴我要完成這個任務的簡短方法嗎?爲什麼VARCHAR支持英鎊符號而不是盧比符號?我在問,因爲我必須將英鎊符號更改爲盧比符號。

+0

嘗試用nvarchar的,它可以存儲Unicode字符也 –

+0

爲什麼不能您使用INFORMATION_SCHEMA.COLUMNS – mohan111

回答

0
SELECT 'ALTER TABLE' +QUOTENAME(TABLE_SCHEMA)+'.'+QUOTENAME(TABLE_NAME)+ 'ALTER COLUMN ' + COLUMN_NAME + ' NVARCHAR(100)' 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = N'TAbleName' 
0

通常在SQLSERVER VARCHAR數據類型只允許ANSI字符,但NVARCHAR允許UNICODE字符還規定,英鎊符號(156-ASCII數字),$符號來下ANSI字符集。

因此VARCHAR允許那些。

但是當u說到盧比符號的最近發明了這樣談到下UNICODE字符集,以達到我們需要使用盧比的字體或字形盧比符號... 希望你明白Ÿ英鎊來VARCHAR下和盧比NVARCHAR下,來... ...

+0

獲取表列名稱,您必須編輯您的答案ASCII是7位。英鎊符號沒有ascii。 ASCII只定義代碼0-127所有其他擴展名。只要通過這個http://en.wikipedia.org/wiki/Code_page_437 –

2

您可以查看所有的列,其數據類型和它們屬於使用FF查詢表:你想生成一個動態

SELECT 
    t.name AS table_name, 
    c.name AS column_name, 
    tp.name AS data_type, 
    c.max_length, 
    c.is_nullable 
FROM sys.tables AS t 
INNER JOIN sys.columns c 
    ON t.OBJECT_ID = c.OBJECT_ID 
INNER JOIN sys.types tp 
    ON tp.user_type_id = c.user_type_id 
WHERE tp.name = 'varchar' 

從上面的查詢sql那會將您所有的VARCHAR列更改爲NVARCHAR

DECLARE @sql AS VARCHAR(MAX) = '' 

SELECT @sql = @sql 
    + 'ALTER TABLE ' + table_name 
    + ' ALTER COLUMN ' + column_name + ' NVARCHAR(' 
     + CASE WHEN max_length <> - 1 THEN CAST(max_length AS VARCHAR(10)) ELSE 'MAX' END + ')' 
     + CASE WHEN is_nullable = 1 THEN ' NULL' ELSE '' END 
     + ';' + CHAR(10) 
FROM (
    SELECT 
     t.name AS table_name, 
     c.name AS column_name, 
     tp.name AS data_type, 
     c.max_length, 
     c.is_nullable 
    FROM sys.tables AS t 
    INNER JOIN sys.columns c 
     ON t.OBJECT_ID = c.OBJECT_ID 
    INNER JOIN sys.types tp 
     ON tp.user_type_id = c.user_type_id 
    WHERE tp.name = 'varchar' 
)t 

PRINT @sql 
EXEC(@sql) 
+0

方便的腳本,謝謝。一個調整,記住nvarchar的數據長度(字符* 2)+2(根據:https://msdn.microsoft.com/en-us/library/ms186939.aspx),所以爲了防止截斷現有數據,你可能想要改變你的腳本來使用它:'CAST((max_length * 2)+ 2 AS VARCHAR(10))' –

+0

max_length值是字段可容納的字符數。前面評論引用的文章是指實際的存儲成本。如果你想要一個varchar或者一個nvarchar來保存255個字符,那麼這個長度將被定義爲:varchar(255)和nvarchar(255),而不是nvarchar(512),所以說明的答案是正確的我的想法是 – Drew

0

通過所有的表和字段這將循環,並會生成查詢更新那些具有數據類型爲varchar

SET NOCOUNT ON 

DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @Length nvarchar(128) 
SET @TableName = '' 

WHILE @TableName IS NOT NULL 

BEGIN 
    SET @ColumnName = '' 
    SET @TableName = 
    (
     SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)) 
     FROM  INFORMATION_SCHEMA.TABLES 
     WHERE   TABLE_TYPE = 'BASE TABLE' 
      AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName 
      AND OBJECTPROPERTY(
        OBJECT_ID(
         QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) 
         ), 'IsMSShipped' 
          ) = 0 
    ) 

    WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL) 

    BEGIN 
      SELECT @ColumnName=MIN(QUOTENAME(COLUMN_NAME)),@Length=MIN(CHARACTER_MAXIMUM_LENGTH) 
      FROM  INFORMATION_SCHEMA.COLUMNS 
      WHERE   TABLE_SCHEMA = PARSENAME(@TableName, 2) 
       AND TABLE_NAME = PARSENAME(@TableName, 1) 
       --AND DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar', 'int', 'decimal') 
       AND DATA_TYPE IN ('varchar') 
       AND QUOTENAME(COLUMN_NAME) > @ColumnName 


     IF @ColumnName IS NOT NULL and @Length > 0 

     BEGIN 

      print (' ALTER TABLE ' [email protected]+ ' ALTER COLUMN ' + @ColumnName + ' NVARCHAR('[email protected]+')') 

      --exec (@dSql) 

     END 
    END  
END 
相關問題