SQL Server Change all VARCHAR columns to NVARCHAR

fcg9iug3  于 2023-11-16  发布在  其他
关注(0)|答案(6)|浏览(109)

I have about 200 columns in my database with VARCHAR type which is unable to store the rupee symbol. Now I have to change the datatype of all the columns from VARCHAR to NVARCHAR .

Can anyone please tell me the short way to accomplish this? And why does the VARCHAR support the pound sign and not the rupee sign? I'm asking because I have to change the pound symbol to rupee symbol.

w6mmgewl

w6mmgewl1#

You can view all the columns, their data types and the table they belong using the ff query:

  1. SELECT
  2. t.name AS table_name,
  3. c.name AS column_name,
  4. tp.name AS data_type,
  5. c.max_length,
  6. c.is_nullable
  7. FROM sys.tables AS t
  8. INNER JOIN sys.columns c
  9. ON t.OBJECT_ID = c.OBJECT_ID
  10. INNER JOIN sys.types tp
  11. ON tp.user_type_id = c.user_type_id
  12. WHERE tp.name = 'varchar'

From the query above, you want to generate a dynamic sql that will change all your VARCHAR columns to NVARCHAR .

  1. DECLARE @sql AS VARCHAR(MAX) = ''
  2. SELECT @sql = @sql
  3. + 'ALTER TABLE ' + table_name
  4. + ' ALTER COLUMN ' + column_name + ' NVARCHAR('
  5. + CASE WHEN max_length <> - 1 THEN CAST(max_length AS VARCHAR(10)) ELSE 'MAX' END + ')'
  6. + CASE WHEN is_nullable = 1 THEN ' NULL' ELSE '' END
  7. + ';' + CHAR(10)
  8. FROM (
  9. SELECT
  10. t.name AS table_name,
  11. c.name AS column_name,
  12. tp.name AS data_type,
  13. c.max_length,
  14. c.is_nullable
  15. FROM sys.tables AS t
  16. INNER JOIN sys.columns c
  17. ON t.OBJECT_ID = c.OBJECT_ID
  18. INNER JOIN sys.types tp
  19. ON tp.user_type_id = c.user_type_id
  20. WHERE tp.name = 'varchar'
  21. )t
  22. PRINT @sql
  23. EXEC(@sql)
展开查看全部
relj7zay

relj7zay2#

I met this issue today and Felix's answer worked quite well with one exception- if the column has default value defined. I researched a little bit and came up with the following script that drops and restores the default value.

Edited is_nullable line based on Fredrik's comment.

  1. DECLARE @sql AS VARCHAR(MAX) = ''
  2. SELECT @sql = @sql
  3. + CASE WHEN default_id>0 THEN 'ALTER TABLE '+table_name+' DROP CONSTRAINT '+OBJECT_NAME(default_id) +';'+CHAR(10) ELSE '' END
  4. + 'ALTER TABLE ' + table_name
  5. + ' ALTER COLUMN ' + column_name + ' NVARCHAR('
  6. + CASE WHEN (max_length <> - 1 AND max_length<4001) THEN CAST(max_length AS VARCHAR(10)) ELSE 'MAX' END + ')'
  7. + CASE WHEN is_nullable = 1 THEN '' ELSE ' NOT NULL' END
  8. + ';' + CHAR(10)
  9. + CASE WHEN default_id>0 THEN 'ALTER TABLE '+table_name+' ADD DEFAULT '+default_value+' FOR '+column_name +';'+CHAR(10) ELSE '' END
  10. FROM (
  11. SELECT
  12. t.name AS table_name,
  13. c.name AS column_name,
  14. tp.name AS data_type,
  15. c.max_length,
  16. c.default_object_id AS default_id,
  17. OBJECT_DEFINITION(c.default_object_id) AS default_value,
  18. c.is_nullable
  19. FROM sys.tables AS t
  20. INNER JOIN sys.columns c
  21. ON t.OBJECT_ID = c.OBJECT_ID
  22. INNER JOIN sys.types tp
  23. ON tp.user_type_id = c.user_type_id
  24. WHERE tp.name = 'varchar'
  25. )t
  26. PRINT @sql
  27. EXEC(@sql)
展开查看全部
qoefvg9y

qoefvg9y3#

Normally in sqlserver VARCHAR datatype allows only the ANSI Characters, But NVARCHAR allows UNICODE Character sets also, Pound symbol(156-ascii number), $ symbols are comes under ANSI character set.

So VARCHAR allows those.

But when u comes to the Rupee Symbol its recently invented so it comes under UNICODE character set, to achieve the rupee symbol we need to use rupees font or glyphs... Hope you understood y Pound comes under VARCHAR and Rupee Comes under NVARCHAR ...

mefy6pfw

mefy6pfw4#

Adding on to Felix Pamittan's answer if you need to include schema.

  1. DECLARE @sql AS VARCHAR(MAX) = ''
  2. SELECT @sql = @sql
  3. + 'ALTER TABLE ' + table_schema_name + '.' + table_name
  4. + ' ALTER COLUMN ' + column_name + ' NVARCHAR('
  5. + CASE WHEN max_length <> - 1 THEN CAST(max_length AS VARCHAR(10)) ELSE 'MAX' END + ')'
  6. + CASE WHEN is_nullable = 1 THEN ' NULL' ELSE '' END
  7. + ';' + CHAR(10)
  8. FROM (
  9. SELECT
  10. sc.name AS table_schema_name,
  11. t.name AS table_name,
  12. c.name AS column_name,
  13. tp.name AS data_type,
  14. c.max_length,
  15. c.is_nullable
  16. FROM sys.tables AS t
  17. INNER JOIN sys.columns c
  18. ON t.OBJECT_ID = c.OBJECT_ID
  19. INNER JOIN sys.types tp
  20. ON tp.user_type_id = c.user_type_id
  21. INNER JOIN sys.schemas sc
  22. ON sc.schema_id = t.schema_id
  23. WHERE tp.name = 'varchar'
  24. )t
  25. PRINT @sql
  26. EXEC(@sql)
展开查看全部
z9zf31ra

z9zf31ra5#

This will loop through all tables and their columns, and will generate query for updating those which have datatype as varchar

  1. SET NOCOUNT ON
  2. DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @Length nvarchar(128)
  3. SET @TableName = ''
  4. WHILE @TableName IS NOT NULL
  5. BEGIN
  6. SET @ColumnName = ''
  7. SET @TableName =
  8. (
  9. SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
  10. FROM INFORMATION_SCHEMA.TABLES
  11. WHERE TABLE_TYPE = 'BASE TABLE'
  12. AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName
  13. AND OBJECTPROPERTY(
  14. OBJECT_ID(
  15. QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)
  16. ), 'IsMSShipped'
  17. ) = 0
  18. )
  19. WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL)
  20. BEGIN
  21. SELECT @ColumnName=MIN(QUOTENAME(COLUMN_NAME)),@Length=MIN(CHARACTER_MAXIMUM_LENGTH)
  22. FROM INFORMATION_SCHEMA.COLUMNS
  23. WHERE TABLE_SCHEMA = PARSENAME(@TableName, 2)
  24. AND TABLE_NAME = PARSENAME(@TableName, 1)
  25. --AND DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar', 'int', 'decimal')
  26. AND DATA_TYPE IN ('varchar')
  27. AND QUOTENAME(COLUMN_NAME) > @ColumnName
  28. IF @ColumnName IS NOT NULL and @Length > 0
  29. BEGIN
  30. print (' ALTER TABLE ' +@TableName+ ' ALTER COLUMN ' + @ColumnName + ' NVARCHAR('+@Length+')')
  31. --exec (@dSql)
  32. END
  33. END
  34. END
展开查看全部
kqqjbcuj

kqqjbcuj6#

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

相关问题