2015-06-11 3 views
0

У меня около 200 столбцов в моей базе данных с VARCHAR типами, которые не могут хранить символ рупии. Теперь мне нужно изменить тип данных всех столбцов от VARCHAR до NVARCHAR.Изменить все колонки VARCHAR на NVARCHAR

Может ли кто-нибудь, пожалуйста, сказать мне короткий путь для этого? И почему VARCHAR поддерживает знак фунта, а не знак рупии? Я спрашиваю, потому что мне нужно изменить символ фунта на символ рупии.

+0

попробовать с NVARCHAR, он может хранить символы Юникода также –

+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 позволяет им.

Но когда и приходит к рупии Символ его недавно изобрел так оно попадает под UNICODE набор символов, для достижения символа рупии, мы должны использовать рупии шрифт или глифы ... Надеюсь, вы поняли, у фунт приходит под VARCHAR и рупия Поставляется под NVARCHAR ...

+0

, вы должны отредактировать свой ответ. ASCII - 7 бит. и знак фунта не имеет ascii. ASCII определяет только коды 0-127. Все остальные являются расширениями. Просто просмотрите это http://en.wikipedia.org/wiki/Code_page_437 –

2

вы можете просмотреть все столбцы, их тип данных и таблицу они принадлежат, используя Ф.Ф. запрос:

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

Удобный скрипт, спасибо. Одна настройка, помните, что длина данных (chars * 2) +2 для nvarchar (по адресу: 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 
Смежные вопросы