Sql 数据中带有(逗号)的CSV文件的大容量插入/OPENROWSET格式文件终止符

Sql 数据中带有(逗号)的CSV文件的大容量插入/OPENROWSET格式文件终止符,sql,sql-server,c#-4.0,bulkinsert,openrowset,Sql,Sql Server,C# 4.0,Bulkinsert,Openrowset,我已经为我的百万行CSV编写了一个很好的导入,它运行得非常好(使用OPENROWSET批量(我没有使用批量插入,因为我需要与其他一些列交叉连接)。formatfile使用逗号作为终止符 以下是我用于开发的CSV示例: Reference, Name, Street 1,Dave Smith, 1 Test Street 2,Sally SMith,1 Test Street 一旦我让它工作起来,有人提醒我数据本身可能有一个逗号,哇 Reference, Name, Street "1","Da

我已经为我的百万行CSV编写了一个很好的导入,它运行得非常好(使用OPENROWSET批量(我没有使用批量插入,因为我需要与其他一些列交叉连接)。formatfile使用逗号作为终止符

以下是我用于开发的CSV示例:

Reference, Name, Street
1,Dave Smith, 1 Test Street
2,Sally SMith,1 Test Street
一旦我让它工作起来,有人提醒我数据本身可能有一个逗号,哇

Reference, Name, Street
"1","Dave Smith", "1 Test Street"
"2","Sally Smith","1,Test Street" <-comma in street
参考、名称、街道 “1”、“戴夫·史密斯”、“测试街1”
“2”、“Sally Smith”、“1,Test Street”如果数据中可能出现字段终止符,则最好使用制表符或管道分隔符(或适用于数据的任何内容)

如果终止符字符出现在数据中,则解释为 一个终止符,不作为数据,该字符后面的数据是 解释为属于下一个字段或记录。因此, 仔细选择你的终结者,确保他们永远不会出现 在您的数据中


数据字段中的分隔符是分隔文件的常见问题。解决此问题的一些常用策略包括:

  • 重新创建数据文件,在将数据字段写入文件之前,将所有出现的分隔符从数据字段中删除:这将消除OPENROWSET错误,但不会保留数据的完整性
  • 使用不同的分隔符重新创建数据文件:根据我的经验,制表符分隔符是更好的选择。在数据中遇到制表符比遇到逗号更不常见。但这肯定不是闻所未闻的。我也见过数据中的制表符
  • 将数据字段用双引号括起来:这需要对XML格式文件进行一些调整
  • 手动编辑数据文件可能适用于上述任何选项。但这可能会很繁琐,尤其是对于大型文件。(仅在Notepad.exe中打开几个GB的文件是一个耐心的练习。)实际上,您希望作者为您重新创建它。选项#1应始终“有效”。但同样,您可能无法忍受数据完整性问题。选项2可能适用于许多情况,但它不是防弹的。选项3也不是防弹的(在数据字段中始终可以有一个分隔符),但它尽可能接近。此外,它保留了数据完整性

    以下是XML格式文件的一种可能性:

    <?xml version="1.0"?>
    <BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <RECORD>
      <FIELD ID="1" xsi:type="CharTerm" TERMINATOR='","' MAX_LENGTH="5"/>
      <FIELD ID="2" xsi:type="CharTerm" TERMINATOR='","' MAX_LENGTH="128" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
      <FIELD ID="3" xsi:type="CharTerm" TERMINATOR='"\r\n' MAX_LENGTH="128" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
     </RECORD>
     <ROW>
      <COLUMN SOURCE="1" NAME="Reference" xsi:type="SQLVARYCHAR"/>
      <COLUMN SOURCE="2" NAME="Name" xsi:type="SQLVARYCHAR"/>
      <COLUMN SOURCE="3" NAME="Street" xsi:type="SQLVARYCHAR"/>
     </ROW>
    </BCPFORMAT>
    
    
    
    请注意字段终止符:我使用单引号来标识
    ”,“
    作为终止符,
    ”\r\n
    作为行终止符(第3列终止符)。我有根据地猜测
    Name
    Street
    最多可包含128个字符,请根据需要进行编辑

    问题:

  • OPENROWSET()查询将返回带有前导双引号字符的
    引用
  • 引用
    不能作为INT(或SMALLINT、BIGINT等)返回。它将作为VARCHAR返回(
    xsi:type=“SQLVARYCHAR”
  • 对于提供的特定数据示例,我将从
    引用
    数据字段中删除双引号,调整XML格式文件,使
    字段ID=“1”
    具有
    终止符=”,“'
    ,并进一步调整XML格式文件,使
    列源=“1”
    具有
    xsi:type=“SQLINT”


    对于一些附加信息,这个博客文章可能有帮助:

    我知道大多数导入实用程序都会忽略字符串中逗号(或其他分隔符)——它们认为是字符串的一部分。此外,如果最终在字符串中(在引号之间)是制表符,会发生什么情况??您最终也会遇到同样的问题。看看是否可以指定字符串分隔符,您可能会没事。