我正在尝试批量插入几个固定长度的数据文件。我已经创建了数据库表格和格式文件。然后我尝试以下。例如,我有一个像这样的格式文件:
<?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
命令解释它的方式预览数据?
答案 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>