Unicode平面文件导入到SQL

时间:2017-09-18 11:33:24

标签: sql-server unicode utf-8

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

包装字段

wrapping fields

Source是固定长度的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导入, - 批量导入, - openrowset, - 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'等)

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

有亲切的问候, 穆拉特

1 个答案:

答案 0 :(得分:0)

这正是我在使用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