2015-06-11 136 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 
相关问题