我在我的数据库中有大约200个VARCHAR类型的列,该类型无法存储卢比符号。现在我需要将所有这些列的数据类型从VARCHAR更改为NVARCHAR。
请问有什么简便的方法可以实现此操作吗?为什么VARCHAR支持英镑符号而不支持卢比符号?我的原因是要将英镑符号更改为卢比符号。
我在我的数据库中有大约200个VARCHAR类型的列,该类型无法存储卢比符号。现在我需要将所有这些列的数据类型从VARCHAR更改为NVARCHAR。
请问有什么简便的方法可以实现此操作吗?为什么VARCHAR支持英镑符号而不支持卢比符号?我的原因是要将英镑符号更改为卢比符号。
SELECT column_name, data_type, table_name
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'
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)
DECLARE @sql AS VARCHAR(MAX) = ''
SELECT @sql = @sql
+ CASE WHEN default_id>0 THEN 'ALTER TABLE '+table_name+' DROP CONSTRAINT '+OBJECT_NAME(default_id) +';'+CHAR(10) ELSE '' END
+ 'ALTER TABLE ' + table_name
+ ' ALTER COLUMN ' + column_name + ' NVARCHAR('
+ CASE WHEN (max_length <> - 1 AND max_length<4001) THEN CAST(max_length AS VARCHAR(10)) ELSE 'MAX' END + ')'
+ CASE WHEN is_nullable = 1 THEN ' NULL' ELSE '' END
+ ';' + CHAR(10)
+ CASE WHEN default_id>0 THEN 'ALTER TABLE '+table_name+' ADD DEFAULT '+default_value+' FOR '+column_name +';'+CHAR(10) ELSE '' END
FROM (
SELECT
t.name AS table_name,
c.name AS column_name,
tp.name AS data_type,
c.max_length,
c.default_object_id AS default_id,
OBJECT_DEFINITION(c.default_object_id) AS default_value,
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)
VARCHAR
数据类型仅允许使用ANSI字符集,但是NVARCHAR
允许使用UNICODE字符集,井号符号(156-ascii编号),$符号属于ANSI字符集。
因此,VARCHAR
允许这些字符。
但是当涉及到卢比符号时,它是最近发明的,因此属于UNICODE字符集,为了实现卢比符号,我们需要使用卢比字体或字形...希望您理解为什么井号属于VARCHAR
而卢比符号属于NVARCHAR
...
DECLARE @sql AS VARCHAR(MAX) = ''
SELECT @sql = @sql
+ 'ALTER TABLE ' + table_schema_name + '.' + 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
sc.name AS table_schema_name,
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
INNER JOIN sys.schemas sc
ON sc.schema_id = t.schema_id
WHERE tp.name = 'varchar'
)t
PRINT @sql
EXEC(@sql)
这将循环遍历所有表及其列,并生成更新查询,用于更新那些数据类型为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 ' +@TableName+ ' ALTER COLUMN ' + @ColumnName + ' NVARCHAR('+@Length+')')
--exec (@dSql)
END
END
END
SELECT 'ALTER TABLE' +QUOTENAME(TABLE_SCHEMA)+'.'+QUOTENAME(TABLE_NAME)+ 'ALTER COLUMN ' + COLUMN_NAME + ' NVARCHAR(100)'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = N'TAbleName'