【问题标题】:BULK INSERT tab-delimited file - With commas in DescriptionBULK INSERT 制表符分隔文件 - 在描述中使用逗号
【发布时间】:2015-07-21 08:38:32
【问题描述】:

我正在尝试使用 BULK INSERT 功能导入 CSV 文件。我是通过 SQL 来做的,因为它可以是一个自动化的过程。我发现的问题是我从客户端获得的 CSV 文件在项目描述中有逗号,即 Rosetta 10,5x25x4 - 当我尝试导入它时,描述中的逗号会导致问题:这是我正在运行的脚本:

BULK INSERT ORDERS_DATA
FROM 'C:\back_orders_2013.csv'
WITH
(
    FIRSTROW = 2,
    FIELDTERMINATOR = ',',  
    ROWTERMINATOR = '\n',  
    TABLOCK
)

有没有办法像在 excel 中一样将连续分隔符视为一个来忽略它?

【问题讨论】:

  • 如果它是制表符分隔的,为什么你的字段终止符是逗号?
  • 它不是制表符分隔的 - 它是逗号分隔的,但在某些描述中还有一个逗号。我试图忽略这些字段中的逗号。这是描述列中的完整描述 - Rosetta 10,5x25x4
  • 如果DESCRIPTION列有逗号,那么应该有文本限定符用来区分你的字段数据和你的分隔符。
  • 我应该在哪里添加文本限定符?只需阅读它,看起来我需要创建另一个 .txt 文件来指定每列数据。对吗?
  • 是的..您可以在链接中找到示例csv的示例:msbiguide.com/wp-content/uploads/2013/10/1.jpg

标签: sql sql-server sql-server-2008 csv


【解决方案1】:

解决办法如下:

<?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="100" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
      <FIELD ID="2" xsi:type="CharTerm" TERMINATOR=',' MAX_LENGTH="100" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
      <FIELD ID="3" xsi:type="CharTerm" TERMINATOR=',' MAX_LENGTH="100" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
      <FIELD ID="4" xsi:type="CharTerm" TERMINATOR=',' MAX_LENGTH="100" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
      <FIELD ID="5" xsi:type="CharTerm" TERMINATOR=',' MAX_LENGTH="100" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
      <FIELD ID="6" xsi:type="CharTerm" TERMINATOR=',' MAX_LENGTH="100" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
      <FIELD ID="7" xsi:type="CharTerm" TERMINATOR=',' MAX_LENGTH="100" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
      <FIELD ID="8" xsi:type="CharTerm" TERMINATOR=',' MAX_LENGTH="100" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
      <FIELD ID="9" xsi:type="CharTerm" TERMINATOR=',' MAX_LENGTH="100" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
      <FIELD ID="10" xsi:type="CharTerm" TERMINATOR=',' MAX_LENGTH="100" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
      <FIELD ID="11" xsi:type="CharTerm" TERMINATOR=',' MAX_LENGTH="100" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
      <FIELD ID="12" xsi:type="CharTerm" TERMINATOR=',' MAX_LENGTH="100" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
      <FIELD ID="13" xsi:type="CharTerm" TERMINATOR=',' MAX_LENGTH="100" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
      <FIELD ID="14" xsi:type="CharTerm" TERMINATOR=',' MAX_LENGTH="100" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
      <FIELD ID="15" xsi:type="CharTerm" TERMINATOR=',' MAX_LENGTH="100" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
      <FIELD ID="16" xsi:type="CharTerm" TERMINATOR=',' MAX_LENGTH="100" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
      <FIELD ID="17" xsi:type="CharTerm" TERMINATOR=',' MAX_LENGTH="100" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
      <FIELD ID="18" xsi:type="CharTerm" TERMINATOR=',' MAX_LENGTH="100" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
      <FIELD ID="19" xsi:type="CharTerm" TERMINATOR='\n' MAX_LENGTH="100" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
     </RECORD>
     <ROW>
      <COLUMN SOURCE="1" NAME="RKID" xsi:type="SQLVARYCHAR" />
      <COLUMN SOURCE="2" NAME="ORNO" xsi:type="SQLVARYCHAR" />
      <COLUMN SOURCE="3" NAME="PONO" xsi:type="SQLVARYCHAR" />
      <COLUMN SOURCE="4" NAME="ITEM_CODE" xsi:type="SQLVARYCHAR" />
    <COLUMN SOURCE="5" NAME="ITEM_DESCRIPTION" xsi:type="SQLVARYCHAR" />
    <COLUMN SOURCE="6" NAME="ORDER_QTY" xsi:type="SQLVARYCHAR" />
    <COLUMN SOURCE="7" NAME="DELIVER_QTY" xsi:type="SQLVARYCHAR" />
    <COLUMN SOURCE="8" NAME="B_QTY" xsi:type="SQLVARYCHAR" />
    <COLUMN SOURCE="9" NAME="RTS_DATE" xsi:type="SQLVARYCHAR" />
    <COLUMN SOURCE="10" NAME="PRICE" xsi:type="SQLVARYCHAR" />
    <COLUMN SOURCE="11" NAME="PLEV" xsi:type="SQLVARYCHAR" />
    <COLUMN SOURCE="12" NAME="DISCOUNT1" xsi:type="SQLVARYCHAR" />
    <COLUMN SOURCE="13" NAME="DISCOUNT2" xsi:type="SQLVARYCHAR" />
    <COLUMN SOURCE="14" NAME="DISCOUNT3" xsi:type="SQLVARYCHAR" />
    <COLUMN SOURCE="15" NAME="TOTAL" xsi:type="SQLVARYCHAR" />
    <COLUMN SOURCE="16" NAME="CURRENCY" xsi:type="SQLVARYCHAR" />
    <COLUMN SOURCE="17" NAME="ORDER_DATE" xsi:type="SQLVARYCHAR" />
    <COLUMN SOURCE="18" NAME="BKYN" xsi:type="SQLVARYCHAR" />
    <COLUMN SOURCE="19" NAME="PENTA_REF" xsi:type="SQLVARYCHAR" />
     </ROW>
    </BCPFORMAT>

这 100% 有效,我收到的错误:

字符串或二进制数据将被截断。该声明已 终止

是因为我的一个数据字段的长度。

【讨论】:

  • 抱歉,我看到它仍然没有正确地显示描述。我注意到带有逗号的描述被插入到“”中。这是字段 5。我应该如何更改?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-19
  • 2012-07-15
  • 1970-01-01
  • 1970-01-01
  • 2012-02-06
  • 1970-01-01
  • 2016-12-27
相关资源
最近更新 更多