我使用的是SQL Server 2014 Enterprise和Visual Studio 2103。
我有数百个TSV文件,其中包含我导入SQL Server的外来字符。我有一个自动化的SSIS包(只是我在网上找到的使用C#的脚本任务)。使用NVARCHAR(MAX)
数据类型为所有列创建表,然后脚本逐行读取每个文件,并将值插入表中。
源TSV文件以Unicode格式导出,但SQL Server似乎并不关心 - 它将文件导入为VARCHAR
(即汉字过来为" ???? ?&#34)。如果手动将文件导入SQL Server,代码页将显示" 65001(UTF-8)"所以我不确定为什么数据类型默认为VARCHAR
。
现在,我想我可以为每个文件配置一个DATA CONVERSION TRANSFORM,但文件太多了,我认为这可以在脚本任务插入中动态完成:
SCRIPT TASK:
编码的一些变量:
Encoding ascii = Encoding.ASCII;
Encoding unicode = Encoding.Unicode;
Encoding utf8 = Encoding.UTF8;
Encoding utf32 = Encoding.UTF32;
脚本任务代码的以下部分是我尝试转换编码的地方(IF语句的第一部分(未显示)创建接收表)。它错误地指出:
else
{
//ADJUST FOR SINGLE QUOTES:
line = line.Replace("'", "''");
byte[] unicodeBYTES = unicode.GetBytes(line);
byte[] unicodeCONVERT = Encoding.Convert(unicode, utf8, unicodeBYTES); <--- ERRORS OUT
char[] unicodeCHARS = new char[unicode.GetCharCount(unicodeCONVERT, 0, unicodeCONVERT.Length)];
unicode.GetChars(unicodeCONVERT, 0, unicodeCONVERT.Length, unicodeCHARS, 0);
string NEWline = new string(unicodeCHARS);
string query = "Insert into " + SchemaName + ".[" + TableName + "] (" + ColumnList + ") ";
query += "VALUES('" + NEWline + "')";
// MessageBox.Show(query.ToString());
SqlCommand myCommand1 = new SqlCommand(query, myADONETConnection);
myCommand1.ExecuteNonQuery();
}
但是,如果我改变了行:
byte[] unicodeCONVERT = Encoding.Convert(unicode, utf8, unicodeBYTES);
以下内容:
byte[] unicodeCONVERT = Encoding.Convert(unicode, unicode, unicodeBYTES);
它加载数据,但仍然是ASCII格式(使用&#34; ?????&#34;字符)。
任何帮助都将不胜感激。
谢谢。