我的数据库中有大约200列,其中VARCHAR
类型无法存储卢比符号。现在我必须将所有列的数据类型从VARCHAR
更改为NVARCHAR
。将所有VARCHAR列更改为NVARCHAR
任何人都可以告诉我要完成这个任务的简短方法吗?为什么VARCHAR
支持英镑符号而不是卢比符号?我在问,因为我必须将英镑符号更改为卢比符号。
我的数据库中有大约200列,其中VARCHAR
类型无法存储卢比符号。现在我必须将所有列的数据类型从VARCHAR
更改为NVARCHAR
。将所有VARCHAR列更改为NVARCHAR
任何人都可以告诉我要完成这个任务的简短方法吗?为什么VARCHAR
支持英镑符号而不是卢比符号?我在问,因为我必须将英镑符号更改为卢比符号。
SELECT 'ALTER TABLE' +QUOTENAME(TABLE_SCHEMA)+'.'+QUOTENAME(TABLE_NAME)+ 'ALTER COLUMN ' + COLUMN_NAME + ' NVARCHAR(100)'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = N'TAbleName'
通常在SQLSERVER VARCHAR
数据类型只允许ANSI字符,但NVARCHAR
允许UNICODE字符还规定,英镑符号(156-ASCII数字),$符号来下ANSI字符集。
因此VARCHAR
允许那些。
但是当u说到卢比符号的最近发明了这样谈到下UNICODE字符集,以达到我们需要使用卢比的字体或字形卢比符号... 希望你明白Ÿ英镑来VARCHAR
下和卢比NVARCHAR
下,来... ...
获取表列名称,您必须编辑您的答案ASCII是7位。英镑符号没有ascii。 ASCII只定义代码0-127所有其他扩展名。只要通过这个http://en.wikipedia.org/wiki/Code_page_437 –
您可以查看所有的列,其数据类型和它们属于使用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)
方便的脚本,谢谢。一个调整,记住nvarchar的数据长度(字符* 2)+2(根据:https://msdn.microsoft.com/en-us/library/ms186939.aspx),所以为了防止截断现有数据,你可能想要改变你的脚本来使用它:'CAST((max_length * 2)+ 2 AS VARCHAR(10))' –
max_length值是字段可容纳的字符数。前面评论引用的文章是指实际的存储成本。如果你想要一个varchar或者一个nvarchar来保存255个字符,那么这个长度将被定义为:varchar(255)和nvarchar(255),而不是nvarchar(512),所以说明的答案是正确的我的想法是 – Drew
通过所有的表和字段这将循环,并会生成查询更新那些具有数据类型为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
尝试用nvarchar的,它可以存储Unicode字符也 –
为什么不能您使用INFORMATION_SCHEMA.COLUMNS – mohan111