【问题标题】:Unicode flat file import to SQLUnicode 平面文件导入到 SQL
【发布时间】:2018-02-26 22:20:15
【问题描述】:

我正在尝试将数据批量导入 ms-sql 2016,但是由于 2 字节长度的字符(如 Ü、Ä 等),我遇到了问题:

包装字段

来源是带有特殊(宽)字符的固定长度、unicode (utf-8) 文本文件:

这是文件的示例部分:

ABS525                0128211024200
ABS526                0128211024200
ABS527                0128211024200
ABS528                0128211024200
ABS529                0128211024200
Ölrücklaufleitung     0128211037390
Ölzu- und Ölrücklaufle0128211037390
Ölzulaufleitung       0128211037390

字段长度为:22 - 4 - 3 - 5 - 1

我尝试了各种方法: - Management Studio 中的导入向导, - SSDT 导入, - 批量进口, - 开放行集, - bcp 命令行 没有任何作用,实际上,除非行中有特殊字符,否则它们会起作用。

这是我的批量插入代码:

BULK INSERT [tecdoc2].[dbo].[211]
   FROM     'C:\Users\Administrator\Desktop\D_TAF24\211yeni.0128' 
   WITH (MAXERRORS=50, CODEPAGE = '65001', DATAFILETYPE = 'widechar', FORMATFILE = 'C:\Users\Administrator\Desktop\BCP_Formats\a211.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="CharFixed" LENGTH="22"    />
  <FIELD ID="2" xsi:type="CharFixed" LENGTH="4"     COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
  <FIELD ID="3" xsi:type="CharFixed" LENGTH="3"     COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
  <FIELD ID="4" xsi:type="CharFixed" LENGTH="5"     COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
  <FIELD ID="5" xsi:type="CharFixed" LENGTH="1"     COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
  <FIELD ID="6" xsi:type="CharTerm"  TERMINATOR="\r\n" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
 </RECORD>
 <ROW>
  <COLUMN SOURCE="1" NAME="ArtNr"     xsi:type="SQLNVARCHAR" LENGTH="22" />
  <COLUMN SOURCE="2" NAME="DLNr"      xsi:type="SQLNCHAR" />
  <COLUMN SOURCE="3" NAME="SA"        xsi:type="SQLNCHAR" />
  <COLUMN SOURCE="4" NAME="GenArtNr"  xsi:type="SQLNCHAR" />
  <COLUMN SOURCE="5" NAME="Losch-Flag" xsi:type="SQLNCHAR" />
 </ROW>
</BCPFORMAT>

sql中的所有字段都是nvarchar(指定长度,其实我这里做了很多试验:把指定长度加倍,或者'max'等)

你有什么建议吗?我会很感激的。

致以诚挚的问候, 穆拉特

【问题讨论】:

  • 检查 this tutorial 将代码页设置为 65001 并然后验证文本列是否作为 DT_WSTR 导入。
  • 您好 Panagiotis,非常感谢您的建议。实际上,在发布我的问题之前,我已经看过/阅读了您提到的文章。这是一种间接的方式,需要使用 gui。我有 100 多个包含 1000 多个字段的表。我在excel中有所有的字段结构。因此,如果可以通过批量导入、openrowset 等方式实现的话;我会非常快速地创建必要的代码和格式文件。

标签: sql-server unicode utf-8


【解决方案1】:

这正是我遇到的问题,但使用 OPENROWSET。如果文件被分隔,它工作正常。

我发现解决此问题的唯一方法是将整行导入单个 nvarchar(Big Enough) 列并使用数据库解析它。工作正常,但在底部的皇家痛苦。

如果您将格式文件更改为:

<?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="CharFixed" LENGTH="35"    />
  <FIELD ID="2" xsi:type="CharTerm"  TERMINATOR="\r\n"/>
 </RECORD>
 <ROW>
  <COLUMN SOURCE="1" NAME="RowData" xsi:type="SQLNVARCHAR" LENGTH="35"/>
 </ROW>
</BCPFORMAT>

然后你导入查询可以是:

INSERT INTO [tecdoc2].[dbo].[211]
(
    ArtNr
    ,DLNr
    ,SA
    ,GenArtNr
    ,[Losch-Flag]
)
SELECT  SUBSTRING(src.RowData, 0, 22) AS ArtNr
        ,SUBSTRING(src.RowData, 23, 4) AS DLNr
        ,SUBSTRING(src.RowData, 27, 3) AS SA
        ,SUBSTRING(src.RowData, 30, 5) AS GenArtNr
        ,SUBSTRING(src.RowData, 35, 1) AS 'Losch-Flag'

FROM    OPENROWSET  (   BULK 'C:\Users\Administrator\Desktop\D_TAF24\211yeni.0128'
                        ,FORMATFILE = 'C:\Users\Administrator\Desktop\BCP_Formats\a211.xml'
                        ,CODEPAGE = '65001' -- Unicode
                        ,FIRSTROW = 1
                     ) AS src

【讨论】:

  • 将您的 xsi:type 更改为 ncharterm 并为每个终止符添加 \0(即)\r\n -> \r\0\n\0 示例:
猜你喜欢
  • 2017-12-22
  • 2016-07-11
  • 1970-01-01
  • 1970-01-01
  • 2013-08-04
  • 1970-01-01
  • 1970-01-01
  • 2018-05-26
  • 1970-01-01
相关资源
最近更新 更多