Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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
Sql server 为什么';SSI在导入UTF-8平面文件时是否识别换行符{LF}行分隔符?_Sql Server_Sql Server 2008_Utf 8_Ssis_Flat File - Fatal编程技术网

Sql server 为什么';SSI在导入UTF-8平面文件时是否识别换行符{LF}行分隔符?

Sql server 为什么';SSI在导入UTF-8平面文件时是否识别换行符{LF}行分隔符?,sql-server,sql-server-2008,utf-8,ssis,flat-file,Sql Server,Sql Server 2008,Utf 8,Ssis,Flat File,我正在尝试使用SSIS将数据从utf-8编码的平面文件导入SQL Server 2008。这是记事本++中的行尾数据的外观: 我还有几张图片显示了文件连接管理器的外观: 您可以看到数据在文件连接管理器预览中正确显示。当我尝试导入此数据时,没有行导入。我收到一条错误消息,指示找不到行分隔符。您可以在文件连接管理器图像中看到,标题行分隔符和行分隔符都设置为{LF}。这足以生成正确的预览,因此我不明白为什么导入时它不起作用。我尝试了一些没有结果的事情: 尝试在SSMS中使用向导导入…结果相同

我正在尝试使用SSIS将数据从utf-8编码的平面文件导入SQL Server 2008。这是记事本++中的行尾数据的外观:

我还有几张图片显示了文件连接管理器的外观:

您可以看到数据在文件连接管理器预览中正确显示。当我尝试导入此数据时,没有行导入。我收到一条错误消息,指示找不到行分隔符。您可以在文件连接管理器图像中看到,标题行分隔符和行分隔符都设置为
{LF}
。这足以生成正确的预览,因此我不明白为什么导入时它不起作用。我尝试了一些没有结果的事情:

  • 尝试在SSMS中使用向导导入…结果相同
  • 尝试使用数据转换,没有影响
  • 尝试将行分隔符设置为(0a),结果相同
[平面文件源[582]]警告:该 访问时已到达数据文件的结尾 正在读取标题行。确保 标题行分隔符和 要跳过的标题行是正确的

感谢您的关注,我非常感谢您提供的任何帮助。

原因: SSIS无法读取文件并显示以下警告,这是由于列分隔符
ch
(“带cedilla的c”)和行分隔符
{LF}
(换行符)造成的

下面是一个示例SSIS包,它显示了如何使用
脚本组件解决问题,最后还有另一个模拟问题的示例

决议: 下面的示例包是在
SSIS 2008 R2
中编写的。它以行分隔符
{LF}
作为单个列值读取平面文件;然后使用
脚本组件
拆分数据,将信息插入
SQL Server 2008 R2
数据库中的表中

用于创建包含少量行的简单平面文件。下面的示例文件在每一行上都有产品Id和标价信息,以
ch
作为列分隔符分隔,每一行以
{LF}
分隔符结尾

在记事本++上,单击
编码
,然后单击
UTF-8编码
,以
UTF-8编码保存平面文件

此示例将使用名为Sora的SQL Server 2008 R2数据库。使用下面给定的脚本创建一个名为
dbo.ProductListPrice
的新表。SSIS将把平面文件数据插入该表

USE Sora;
GO

CREATE TABLE dbo.ProductListPrice
(
        ProductId   nvarchar(30)    NOT NULL
    ,   ListPrice   numeric(12,2)   NOT NULL
);
GO
使用Business Intelligence Development Studio(BIDS)2008 R2创建SSIS包。将包命名为
SO_6268205.dtsx
。创建名为
Sora.ds
的数据源,以连接到SQL Server 2008 R2中的数据库
Sora

右键单击程序包内的任意位置,然后单击变量
,以查看变量窗格。在包范围
SO_6268205
中创建一个名为
columndimiter
的数据类型
String
的新变量,并使用值
设置变量

右键单击
连接管理器
,然后单击
新建平面文件连接…
创建一个连接以读取平面文件

在平面文件连接管理器编辑器的
常规
页面上,执行以下操作:

  • 将连接管理器名称设置为
    ProductListPrice
  • 将“说明”设置为“平面文件连接管理器”,以读取产品列表价格信息。
  • 选择平面文件路径。我的文件位于路径
    C:\Siva\StackOverflow\Files\6268205\ProductListPrice.txt
  • 从标题行分隔符中选择
    {LF}
  • 检查第一个数据行中的
    列名
  • 单击
    页面
  • 在平面文件连接管理器编辑器的
    页面上,验证
    列分隔符
    是否为空且已禁用。单击
    Advanced
    页面

    在平面文件连接管理器编辑器的
    Advanced
    页面上,执行以下操作

    • 将名称设置为
      LineData
    • 验证列分隔符是否设置为
      {LF}
    • 将数据类型设置为
      Unicode字符串[DT\u WSTR]
    • 将OutputColumnWidth设置为
      255
    • 单击
      预览
      页面

    在平面文件连接管理器编辑器的“预览”页面上,验证显示的数据是否正确,然后单击“确定”

    您将在包底部的
    连接管理器
    选项卡上看到数据源Sora和平面文件连接管理器ProductListPrice

    数据流任务
    拖放到包的控制流选项卡上,并将其命名为
    文件到数据库-不带Cedilla分隔符

    双击数据流任务,将视图切换到包上的
    数据流
    选项卡。将
    平面文件源
    拖放到“数据流”选项卡上。双击平面文件源以打开
    平面文件源编辑器

    在平面文件源代码编辑器的
    连接管理器
    页面上,选择平面文件连接管理器
    产品列表价格
    ,然后单击列页面

    在平面文件源代码编辑器的
    Columns
    页面上,检查列
    LineData
    ,然后单击
    OK

    脚本组件
    拖放到下面的数据流选项卡上
    USE Sora;
    GO
    
    CREATE TABLE dbo.ProductListPrice
    (
            ProductId   nvarchar(30)    NOT NULL
        ,   ListPrice   numeric(12,2)   NOT NULL
    );
    GO
    
    using System;
    using System.Data;
    using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
    using Microsoft.SqlServer.Dts.Runtime.Wrapper;
    
    [Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
    public class ScriptMain : UserComponent
    {
        public override void PreExecute()
        {
            base.PreExecute();
        }
    
        public override void PostExecute()
        {
            base.PostExecute();
        }
    
        public override void FlatFileInput_ProcessInputRow(FlatFileInputBuffer Row)
        {
            const int COL_PRODUCT = 0;
            const int COL_PRICE = 1;
    
            char delimiter = Convert.ToChar(this.Variables.ColumnDelimiter);
            string[] lineData = Row.LineData.ToString().Split(delimiter);
    
            Row.ProductId = String.IsNullOrEmpty(lineData[COL_PRODUCT]) 
                                ? String.Empty 
                                : lineData[COL_PRODUCT];
    
            Row.ListPrice = String.IsNullOrEmpty(lineData[COL_PRICE]) 
                                ? 0 
                                : Convert.ToDecimal(lineData[COL_PRICE]);
        }
    }
    
    [Read flat file [1]] Warning: The end of the data file was reached while 
    reading header rows. Make sure the header row delimiter and the number of 
    header rows to skip are correct.
    
    Dim FileContents As String = My.Computer.FileSystem.ReadAllText("c:\Temp\UnixFile.csv")
    
    Dim NewFileContents As String = FileContents.Replace(vbLf, vbCrLf)
    
    My.Computer.FileSystem.WriteAllText("c:\temp\WindowsFile.csv", NewFileContents, False, New System.Text.UnicodeEncoding)
    
    unix2dos file-to-convert