Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Character encoding 避免SSIS脚本任务将AS400数据的utf-8转换为unicode以用于SQL Server_Character Encoding_Ssis_Ibm Midrange - Fatal编程技术网

Character encoding 避免SSIS脚本任务将AS400数据的utf-8转换为unicode以用于SQL Server

Character encoding 避免SSIS脚本任务将AS400数据的utf-8转换为unicode以用于SQL Server,character-encoding,ssis,ibm-midrange,Character Encoding,Ssis,Ibm Midrange,经过多次尝试,我得出结论,使用SSIS数据从AS400非unicode传输到SQL Server的最佳方式是: 使用本机传输实用程序将数据转储到tsv制表符分隔 将文件从utf-8转换为unicode 使用大容量插入将它们放入SQL Server 在第2步中,我找到了一个现成的代码,可以实现这一点: string from = @"\\appsrv02\c$\bg_f0101.tsv"; string to = @"\\appsrv02\c$\bg_f0101.txt";

经过多次尝试,我得出结论,使用SSIS数据从AS400非unicode传输到SQL Server的最佳方式是:

使用本机传输实用程序将数据转储到tsv制表符分隔

将文件从utf-8转换为unicode

使用大容量插入将它们放入SQL Server

在第2步中,我找到了一个现成的代码,可以实现这一点:

string from = @"\\appsrv02\c$\bg_f0101.tsv";
        string to = @"\\appsrv02\c$\bg_f0101.txt";
        using (StreamReader reader = new StreamReader(from, Encoding.UTF8, false, 1000000))
        using (StreamWriter writer = new StreamWriter(to, false, Encoding.Unicode, 1000000))
        {
            while (!reader.EndOfStream)
            {
                var line = reader.ReadLine();
                if (line.Length > 0)
                    writer.WriteLine(line);
            }
        }       
我需要完全理解编码在这里发生了什么,以及为什么这是必要的


如何用更优雅的解决方案替换此脚本任务?

我不太清楚您为什么需要utf-8转换任务,只是说SQL server(我相信)使用UCS-2作为其本机存储格式,这与utf-16类似,utf-16是您的任务将文件转换为的格式。我很惊讶SSI不能与UTF-8输入源一起工作

我的主要观点是回答如何用更优雅的解决方案替换此脚本任务

我在使用中取得了很多成功。它允许您将您的AS/400/iSeries/System i/设置为SQL server中的链接服务器,然后您可以使用标准的4部分SQL语法(例如,从my400.my400.myLib.myFile中选择*),直接从其链接到的服务器访问400的数据。 甚至更好的是,它比使用EXEC…AT的直通查询更高效


使用这种方法,您根本不需要SSI,只需要一个简单的存储过程,它可以直接从400数据插入目标表。

您使用的是什么本机传输实用程序?它是否使您能够指定所需的目标CCSID?如果是这样的话,也许您可以使用1200,它对应于此上下文中的UTF-16 a.k.a.Unicode。@dmc我正在使用iSeries客户端软件附带的IBM i实用程序的数据传输。是的,它确实能够指定CCSID,我在上面的示例中使用1208。我尝试了很多其他的方法,包括1200,但都没有成功。当我试图运行包时,总是会出错。@dmc:看到这个@dmc:我并不是说你错了,但我只是想了解:在这个上下文中,是什么让你认为Unicode意味着UTF-16?这是SQL Server的问题吗?对于像Encoding.Unicode这样愚蠢的东西,我不会感到惊讶。@JohnY:根据Microsoft的Encoding.Unicode文档,它是在.NET中指定UTF-16LE的一种方法。我同意它有可能混淆,但我无法编辑我的原始评论来澄清。