TSQL从文件读取到VARCHAR/NVARHAR错误



因此,我决定使用TSQL和Microsoft SQL Server Management Studio 2008 R2读取文本文件并将内容存储在NVARCHAR中。我在https://www.simple-talk.com/sql/t-sql-programming/the-tsql-of-text-files/

上找到了这样做的示例

所以我尝试了我的ABC.txt文件,其内容为:


abcdefghijklmnopqrstuvwxyz

abcdefghijklmnopqrstuvwxyz


当我第一次尝试将此文件的内容存储到@myString中时,我使用了此代码:

declare @myString nvarchar(max); 
Select @myString  = BulkColumn
from OPENROWSET(Bulk 'C:Users<myComputer'sNameHere>DocumentsHow2FilesForTestingStuffABC.txt', SINGLE_BLOB) as x 
print @myString;

打印字符串时,我将其作为输出:


我将 nvarchar更改为 varchar,我得到了文件的正确内容。

有人知道为什么会发生这种情况吗?我认为除了nvarcharvarchar可用的空间更多,并且能够容纳Unicode字符。
另外,您通常如何尝试从文件中读取并将内容插入nvarchar

我想这取决于输入文件的编码。

您使用的是SINGLEBLOB,并且根据MSDN,它会导致数据返回为varbinary(MAX)。您的文件可能是使用非unicode编码保存的,因此,当将数据导入到nvarchar列中时,SQL将其错误解释。更改允许字符的类型可以正确读取。请尝试使用UTF-16编码文件,然后尝试将数据导入NVarchar(Max)变量。

update

我试图重新创建您描述的问题。我保存了一个文本文件,其中包含ANSI编码,运行导入脚本并获得类似于您问题中发布的输出。然后,我将文件转换为 ucs-2 Little Endian 编码,在运行脚本后,我获得了正确的输出。

要总结一下,如果要使用SINGLEBLOB选项导入,只需将文件转换为使用 ucs-ucs-ucs-ucs-ucs-ucs-little endian 编码即可正确使用nvarchar SQL类型。

参考链接:

  • Openrowset
  • NCHAR和VARCHAR

最新更新