我的數據庫中有大約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