Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在CSV中使用带格式文件和双引号的大容量插入时出现问题_Sql Server_Csv_Bulkinsert - Fatal编程技术网

Sql server 在CSV中使用带格式文件和双引号的大容量插入时出现问题

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";

我正在使用SQL Server 2014和引用
.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很乐意提供帮助@我很乐意帮忙!