固定长度数据文件,在BULK INSERT之前预览结果

时间:2018-06-14 08:02:43

标签: sql-server sql-server-2008 bulkinsert

我正在尝试批量插入几个固定长度的数据文件。我已经创建了数据库表格和格式文件。然后我尝试以下。例如,我有一个像这样的格式文件:

<?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="4"/>
        <FIELD ID="2" xsi:type="CharFixed" LENGTH="1"/>
        <FIELD ID="3" xsi:type="CharFixed" LENGTH="20"/>
        <FIELD ID="4" xsi:type="CharFixed" LENGTH="50"/>
        <FIELD ID="5" xsi:type="CharFixed" LENGTH="8"/>
        <FIELD ID="6" xsi:type="CharFixed" LENGTH="4"/>
        <FIELD ID="7" xsi:type="CharFixed" LENGTH="8"/>
        <FIELD ID="8" xsi:type="CharFixed" LENGTH="8"/>
        <FIELD ID="9" xsi:type="CharFixed" LENGTH="8"/>
        <FIELD ID="10" xsi:type="CharFixed" LENGTH="1"/>
        <FIELD ID="11" xsi:type="CharFixed" LENGTH="8"/>
        <FIELD ID="12" xsi:type="CharFixed" LENGTH="8"/>
        <FIELD ID="13" xsi:type="CharFixed" LENGTH="8"/>
        <FIELD ID="14" xsi:type="CharFixed" LENGTH="8"/>
        <FIELD ID="15" xsi:type="CharFixed" LENGTH="8"/>
    </RECORD>
    <ROW>
        <COLUMN SOURCE="1" NAME="BSTNUM" xsi:type="SQLCHAR" LENGTH="4"/>
        <COLUMN SOURCE="2" NAME="MUTKOD" xsi:type="SQLCHAR" LENGTH="1"/>
        <COLUMN SOURCE="3" NAME="MDBST" xsi:type="SQLCHAR" LENGTH="20"/>
        <COLUMN SOURCE="4" NAME="MDOBST" xsi:type="SQLCHAR" LENGTH="50"/>
        <COLUMN SOURCE="5" NAME="MDBCOD" xsi:type="SQLCHAR" LENGTH="8"/>
        <COLUMN SOURCE="6" NAME="MDRECL" xsi:type="SQLCHAR" LENGTH="4"/>
        <COLUMN SOURCE="7" NAME="MDDATI" xsi:type="SQLCHAR" LENGTH="8"/>
        <COLUMN SOURCE="8" NAME="MDDATW" xsi:type="SQLCHAR" LENGTH="8"/>
        <COLUMN SOURCE="9" NAME="MDDATU" xsi:type="SQLCHAR" LENGTH="8"/>
        <COLUMN SOURCE="10" NAME="MDSTAT" xsi:type="SQLCHAR" LENGTH="1"/>
        <COLUMN SOURCE="11" NAME="MDANM0" xsi:type="SQLCHAR" LENGTH="8"/>
        <COLUMN SOURCE="12" NAME="MDANM1" xsi:type="SQLCHAR" LENGTH="8"/>
        <COLUMN SOURCE="13" NAME="MDANM2" xsi:type="SQLCHAR" LENGTH="8"/>
        <COLUMN SOURCE="14" NAME="MDANM3" xsi:type="SQLCHAR" LENGTH="8"/>
        <COLUMN SOURCE="15" NAME="MDANTL" xsi:type="SQLCHAR" LENGTH="8"/>
    </ROW>
</BCPFORMAT>

然后在SQL Server 2008命令提示符下我尝试这个:

BULK INSERT
    BST012018_testtable
from
    'D:\testimport\BST012018T.txt'
WITH (
    FORMATFILE='D:\testimport\BST012018T_format.xml',
    ROWS_PER_BATCH = 1000,
    KEEPNULLS
)

并收到错误消息:

  

将varchar数据类型转换为日期时间数据类型会导致超出范围的值。

错误可以在数据文件,固定长度格式文件或数据库表中的数据类型/列中。换句话说,为了实现这一点,这三件事(table,datafile,formatfile)必须完全一致。

我正在处理的数据集包含更多这样的文件,其中一些文件有50多列和> 100.000条记录。因此,找出错误发生的位置需要调整格式文件,可能需要调整表格,试验和错误等。

所以我的问题是,是否有可能以某种方式预览BULK INSERT?从固定长度数据+格式文件中执行SELECT而不是直接插入?或者换句话说,我如何以SQL Server从这种BULK INSERT命令解释它的方式预览数据?

1 个答案:

答案 0 :(得分:0)

我只是想回答我自己的问题。感谢Jeroen Mostert的评论,使用OPENROWSET(BULK..从数据文件中进行选择就是我想要的。

您可以选择TOP 10或类似内容,只查看前几条记录并检查是否有任何错误。顺便说一下datafile和formatfile必须放在服务器上的文件夹中,SQL Server不能只读取你的本地电脑。

SELECT
    TOP 5 *
FROM 
    OPENROWSET(
        BULK 'D:\testimport\BST012018T.txt',
        FORMATFILE = 'D:\testimport\BST012018T_format.xml'
        --,CODEPAGE = '65001' -- 65001 = UTF-8 supported in SQL Server 2016
    ) AS a

看到这样的结果数据集的预览,我可以看出结尾有一个缺失的列,格式文件中也没有行终止符(在我的例子中是Cr Lf)。在RECORD部分,我添加了一个带有属性TERMINATOR的类型为“CharTerm”的最后一个字段,所以像这样:

<?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="4"/>
        <FIELD ID="2" xsi:type="CharFixed" LENGTH="1"/>
        <FIELD ID="3" xsi:type="CharFixed" LENGTH="20"/>
        <FIELD ID="4" xsi:type="CharFixed" LENGTH="50"/>
        <FIELD ID="5" xsi:type="CharFixed" LENGTH="8"/>
        <FIELD ID="6" xsi:type="CharFixed" LENGTH="4"/>
        <FIELD ID="7" xsi:type="CharFixed" LENGTH="8"/>
        <FIELD ID="8" xsi:type="CharFixed" LENGTH="8"/>
        <FIELD ID="9" xsi:type="CharFixed" LENGTH="8"/>
        <FIELD ID="10" xsi:type="CharFixed" LENGTH="1"/>
        <FIELD ID="11" xsi:type="CharFixed" LENGTH="8"/>
        <FIELD ID="12" xsi:type="CharFixed" LENGTH="8"/>
        <FIELD ID="13" xsi:type="CharFixed" LENGTH="8"/>
        <FIELD ID="14" xsi:type="CharFixed" LENGTH="8"/>
        <FIELD ID="15" xsi:type="CharFixed" LENGTH="8"/>
        <FIELD ID="16" xsi:type="CharFixed" LENGTH="8"/>
        <FIELD ID="17" xsi:type="CharTerm" TERMINATOR="\r\n"/>
    </RECORD>
    <ROW>
        <COLUMN SOURCE="1" NAME="BSTNUM" xsi:type="SQLCHAR"/>
        <COLUMN SOURCE="2" NAME="MUTKOD" xsi:type="SQLCHAR"/>
        <COLUMN SOURCE="3" NAME="MDBST" xsi:type="SQLCHAR"/>
        <COLUMN SOURCE="4" NAME="MDOBST" xsi:type="SQLCHAR"/>
        <COLUMN SOURCE="5" NAME="MDBCOD" xsi:type="SQLCHAR"/>
        <COLUMN SOURCE="6" NAME="MDRECL" xsi:type="SQLCHAR"/>
        <COLUMN SOURCE="7" NAME="MDDATI" xsi:type="SQLCHAR"/>
        <COLUMN SOURCE="8" NAME="MDDATW" xsi:type="SQLCHAR"/>
        <COLUMN SOURCE="9" NAME="MDDATU" xsi:type="SQLCHAR"/>
        <COLUMN SOURCE="10" NAME="MDSTAT" xsi:type="SQLCHAR"/>
        <COLUMN SOURCE="11" NAME="MDANM0" xsi:type="SQLCHAR"/>
        <COLUMN SOURCE="12" NAME="MDANM1" xsi:type="SQLCHAR"/>
        <COLUMN SOURCE="13" NAME="MDANM2" xsi:type="SQLCHAR"/>
        <COLUMN SOURCE="14" NAME="MDANM3" xsi:type="SQLCHAR"/>
        <COLUMN SOURCE="15" NAME="MDANTL" xsi:type="SQLCHAR"/>
        <COLUMN SOURCE="16" NAME="EMPTY" xsi:type="SQLCHAR"/>
    </ROW>
</BCPFORMAT>