Sql server 在CSV中使用带格式文件和双引号的大容量插入时出现问题
我正在使用SQL Server 2014和引用Sql server 在CSV中使用带格式文件和双引号的大容量插入时出现问题,sql-server,csv,bulkinsert,Sql Server,Csv,Bulkinsert,我正在使用SQL Server 2014和引用.csv文件和格式文件的批量插入命令。我以前在所有字段(包括列标题)都成功地完成了这项工作,但现在数据格式略有更改,第一列标题和数据没有用双路径包装,并且在创建格式文件时遇到问题 示例数据 Number of Employees;"Employee - First Name (Key)";"Employee - Last Name (Key)";"Employee - E-Mail Address (Key)" 1;"Joe";"Bloggs";
.csv
文件和格式文件的批量插入
命令。我以前在所有字段(包括列标题)都成功地完成了这项工作,但现在数据格式略有更改,第一列标题和数据没有用双路径包装,并且在创建格式文件时遇到问题
示例数据
Number of Employees;"Employee - First Name (Key)";"Employee - Last Name (Key)";"Employee - E-Mail Address (Key)"
1;"Joe";"Bloggs";"joebloggs@msn.com"
请注意,分号是字段分隔符,第一列标题和数据没有引号,以下所有标题和数据都没有引号,并且是一致的
fmt格式文件示例
12.0
5
1 SQLCHAR 0 0 "\"" 0 "" ""
2 SQLCHAR 2 50 ";" 1 "Number of Employees" Latin1_General_CI_AS
3 SQLNCHAR 2 510 "\";\"" 2 "Employee First Name" Latin1_General_CI_AS
4 SQLNCHAR 2 510 "\";\"" 3 "Employee Last Name" Latin1_General_CI_AS
5 SQLNCHAR 2 510 "\"\r\n" 4 "E-Mail Address" Latin1_General_CI_AS
在第一列之前和之后(上面是最新的),我尝试了各种各样的分隔符排列,删除了伪列,但仍然得到相同的错误消息
无法大容量加载,因为文件“\Mypath\import\u staff\u dq.fmt”不完整或无法读取。操作系统错误代码(null)
文件始终处于关闭状态
为了简单起见,我将dest表中的所有字段都设置为
VARCHAR
,我发现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="CharTerm" TERMINATOR=';"' MAX_LENGTH="10"/>
<FIELD ID="2" xsi:type="CharTerm" TERMINATOR='";"' MAX_LENGTH="4000" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="3" xsi:type="CharTerm" TERMINATOR='";"' MAX_LENGTH="4000" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="4" xsi:type="CharTerm" TERMINATOR='"\r\n' MAX_LENGTH="4000" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
</RECORD>
<ROW>
<COLUMN SOURCE="1" NAME="NumberOfEmployees" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="2" NAME="EmployeeFirstName" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="3" NAME="EmployeeLastName" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="4" NAME="EmailAddress" xsi:type="SQLNVARCHAR"/>
</ROW>
</BCPFORMAT>
返回:
+-------------------+-------------------+------------------+-------------------+
| NumberOfEmployees | EmployeeFirstName | EmployeeLastName | EmailAddress |
+-------------------+-------------------+------------------+-------------------+
| 1 | Joe | Bloggs | joebloggs@msn.com |
+-------------------+-------------------+------------------+-------------------+
参考:
我还可以使用非xml格式的文件获得相同的结果,如下所示:
12.0
4
1 SQLCHAR 0 0 ";\"" 1 NumberOfEmployees Latin1_General_CI_AS
2 SQLCHAR 0 0 "\";\"" 2 EmployeeFirstName Latin1_General_CI_AS
3 SQLCHAR 0 0 "\";\"" 3 EmployeeLastName Latin1_General_CI_AS
4 SQLCHAR 0 0 "\"\r\n" 4 EmailAddress Latin1_General_CI_AS
我发现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="CharTerm" TERMINATOR=';"' MAX_LENGTH="10"/>
<FIELD ID="2" xsi:type="CharTerm" TERMINATOR='";"' MAX_LENGTH="4000" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="3" xsi:type="CharTerm" TERMINATOR='";"' MAX_LENGTH="4000" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="4" xsi:type="CharTerm" TERMINATOR='"\r\n' MAX_LENGTH="4000" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
</RECORD>
<ROW>
<COLUMN SOURCE="1" NAME="NumberOfEmployees" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="2" NAME="EmployeeFirstName" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="3" NAME="EmployeeLastName" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="4" NAME="EmailAddress" xsi:type="SQLNVARCHAR"/>
</ROW>
</BCPFORMAT>
返回:
+-------------------+-------------------+------------------+-------------------+
| NumberOfEmployees | EmployeeFirstName | EmployeeLastName | EmailAddress |
+-------------------+-------------------+------------------+-------------------+
| 1 | Joe | Bloggs | joebloggs@msn.com |
+-------------------+-------------------+------------------+-------------------+
参考:
我还可以使用非xml格式的文件获得相同的结果,如下所示:
12.0
4
1 SQLCHAR 0 0 ";\"" 1 NumberOfEmployees Latin1_General_CI_AS
2 SQLCHAR 0 0 "\";\"" 2 EmployeeFirstName Latin1_General_CI_AS
3 SQLCHAR 0 0 "\";\"" 3 EmployeeLastName Latin1_General_CI_AS
4 SQLCHAR 0 0 "\"\r\n" 4 EmailAddress Latin1_General_CI_AS
大容量插入不支持复杂的CSV文件,即带有换行符或引号字符串的文件。这将在SQL Server 2017年发布。为此使用SSI。您可以使用SSMS中的
导入数据
向导导入CSV数据并保存SSIS包以供重用。最常见的情况是使用SSI进行导入和转换,而不是直接bcp或大容量插入。使用Accompanying格式的文件('fmt')当所有字段都用双引号括起来时,我已经成功地使用了它,但在第一列没有用引号括起来的情况下,它不能像上面描述的那样工作。大容量插入不支持复杂的CSV文件,即带有换行符或带引号的字符串的文件。这将在SQL Server 2017年发布。为此使用SSI。您可以使用SSMS中的导入数据
向导导入CSV数据并保存SSIS包以供重用。最常见的情况是使用SSI进行导入和转换,而不是直接bcp或大容量插入。使用Accompanying格式的文件('fmt')当所有字段都用双引号括起来时,我已经成功地使用了它,但在第一列没有用引号括起来的情况下,它不起作用。@KevinM很乐意提供帮助@我很乐意帮忙!