在SQL Server中将varchar转换为nvarchar失败

4
我有一个SQL Server表,其中包含使用SQL Server导入向导进行CSV导入时生成的varchar(50)类型的列。
我想知道如何将此数据类型更改为nvarchar(9),而不会出现SQL Server截断错误。
我尝试进行批量更新以设置我所需的数据类型和列大小,但在尝试将csv加载到我创建的空数据库表中(具有所需的数据类型)时仍然出现了截断错误消息。
感谢任何帮助。

你打算如何将文本“如何在不出现SQL Server 截断错误的情况下将此数据类型更改为nvarchar(9)”存储在类型为nvarchar(9)的列中? - Hamlet Hakobyan
如果该列中的字符超过9个,您是否愿意丢失数据? - M.Ali
嗨,我将把转换后的数据存储在同一个SQL SERVER表中,但是在同一张表中使用新的nvarchar(9)大小字段。 - daveb
嗨,M Ali,是的,我愿意丢失数据。就目前而言,VARCHAR 50列对其包含的数据来说太大了。该列中的数据长度为9。 - daveb
5个回答

6

如果您愿意丢失数据并且nvarchar只能存储9个非Unicode字符,则仅从源表中选择9个字符,您自己进行截断而不是由Sql服务器为您执行。

以下查询将修剪字符串中的任何空格,然后从字符串中仅获取9个字符并将其转换为NVARCHAR(9)...

CREATE TABLE New_TABLE (Col1 NVARCHAR(9), Col2 NVARCHAR(9))
GO

INSERT INTO New_TABLE (Col1, Col2)
SELECT CONVERT(NVARCHAR(9),LEFT(LTRIM(Col1), 9))  
      ,CONVERT(NVARCHAR(9),LEFT(LTRIM(Col2), 9))
FROM Existing_Table
GO

嗨,M Ali,我遇到了一个问题:在使用 ltrim 函数的第一个参数时,参数数据类型为文本无效。但我使用了 Update 语句将 nvarchar(9) 列设置为 (LEFT(LTRIM(Col1), 9)。我已经成功更新了 nvarchar(9) 列。诚挚感谢,Dave - daveb

0
同时,检查目标表的字段类型也非常重要。由于随机转换、修剪、子字符串等同样的错误,我浪费了3个小时,最终发现同事创建的表的字段长度太短了。 希望这能帮助到有需要的人...

0

varchar和nvarchar仅使用所存储数据所需的长度。如果需要Unicode支持,请转换为nvarchar,但将其从50修改为9 - 这有什么意义呢?

如果您的数据始终恰好为9个字符,请考虑使用char(9),并遵循上面的转换建议之一...


0
如果您在导入/导出任务期间遇到此错误,可以在“编写查询以指定要传输的数据”选项中使用select cast(xxx as nvarchar(yyy)) as someName。这将帮助您解决问题。

0

使用varchar(50)进行批量插入到临时表,然后再插入到实际表中

insert into tableName 
select cast(tempcolumn as nvarchar(9)) from temptable

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接