Sql server 大容量插入与格式文件不匹配
我在尝试大容量插入时遇到了一个问题,我无法让它与带有生日列的格式文件一起工作,我得到的只是一个不匹配的错误。 我在下面得到了这个错误 第1行第5列(生日)的大容量加载数据转换错误(指定代码页的类型不匹配或无效字符)。[SQLSTATE 42000](错误4864)。我的格式文件也设置为datetime,临时表也设置为datetime。此外,open_date列将抛出相同的错误。到目前为止,我唯一能让它工作的方法就是做一个浮子Sql server 大容量插入与格式文件不匹配,sql-server,sql-server-2012,bulkinsert,Sql Server,Sql Server 2012,Bulkinsert,我在尝试大容量插入时遇到了一个问题,我无法让它与带有生日列的格式文件一起工作,我得到的只是一个不匹配的错误。 我在下面得到了这个错误 第1行第5列(生日)的大容量加载数据转换错误(指定代码页的类型不匹配或无效字符)。[SQLSTATE 42000](错误4864)。我的格式文件也设置为datetime,临时表也设置为datetime。此外,open_date列将抛出相同的错误。到目前为止,我唯一能让它工作的方法就是做一个浮子 ( MEMBERNUMBER float ,[FI
(
MEMBERNUMBER float
,[FIRSTNAME] varchar(255) null
,[MIDDLENAME] varchar(255) null
,[LASTNAME]varchar(255) null
,[BIRTHDATE] datetime null
,[GENDER] varchar(255) null
,[MARITALSTATUS] varchar(255) null
,[OCCUPATIONINDUSTRY] varchar(255) null
,[OCCUPATIONTITLE]varchar(255) null
,[ADDRESS1]varchar(255) null
,[ADDRESS2]varchar(255)null
,[CITY] varchar(255)null
,[STATE] varchar(255)null
,[POSTALCODE] float null
,[HOMEPHONE] varchar(255) null
,[CELLPHONE] varchar(255) null
,[WORKPHONE] varchar(255) null
,[EMAIL] varchar(255) null
,[ALTERNATEEMAIL] varchar(255) null
,[OPEN_DATE] datetime null
,[MARKETINGOPTION] varchar(255) null
)
BULK INSERT CSVTempData
FROM '\\eftroot\ftps\usr\EmailMarketing.csv'
WITH
(FormatFile = '\\EFTRoot\ftps\Usr\FormatFiles\Test.fmt')
-- format file here
8.0
21
1 SQLFLT8 0 30 "," 1 MEMBERNUMBER SQL_Latin1_General_CP1_CI_AS
2 SQLCHAR 0 255 "," 2 FIRSTNAME SQL_Latin1_General_CP1_CI_AS
3 SQLCHAR 0 255 "," 3 MIDDLENAME SQL_Latin1_General_CP1_CI_AS
4 SQLCHAR 0 255 "," 4 LASTNAME SQL_Latin1_General_CP1_CI_AS
5 SQLDATETIME 0 9 "," 5 BIRTHDATE SQL_Latin1_General_CP1_CI_AS
6 SQLCHAR 0 255 "," 6 GENDER SQL_Latin1_General_CP1_CI_AS
7 SQLCHAR 0 255 "," 7 MARITALSTATUS SQL_Latin1_General_CP1_CI_AS
8 SQLCHAR 0 255 "," 8 OCCUPATIONINDUSTRY SQL_Latin1_General_CP1_CI_AS
9 SQLCHAR 0 255 "," 9 OCCUPATIONTITLE SQL_Latin1_General_CP1_CI_AS
10 SQLCHAR 0 255 "," 10 ADDRESS1 SQL_Latin1_General_CP1_CI_AS
11 SQLCHAR 0 255 "," 11 ADDRESS2 SQL_Latin1_General_CP1_CI_AS
12 SQLCHAR 0 255 "," 12 CITY SQL_Latin1_General_CP1_CI_AS
13 SQLCHAR 0 255 "," 13 STATE SQL_Latin1_General_CP1_CI_AS
14 SQLFLT8 0 8 "," 14 POSTALCODE SQL_Latin1_General_CP1_CI_AS
15 SQLCHAR 0 255 "," 15 HOMEPHONE SQL_Latin1_General_CP1_CI_AS
16 SQLCHAR 0 255 "," 16 CELLPHONE SQL_Latin1_General_CP1_CI_AS
17 SQLCHAR 0 255 "," 17 WORKPHONE SQL_Latin1_General_CP1_CI_AS
18 SQLCHAR 0 255 "," 18 EMAIL SQL_Latin1_General_CP1_CI_AS
19 SQLCHAR 0 255 "," 19 ALTERNATEEMAIL SQL_Latin1_General_CP1_CI_AS
20 SQLDATETIME 0 9 "," 20 OPEN_DATE SQL_Latin1_General_CP1_CI_AS
21 SQLCHAR 0 255 "\r\n" 21 MARKETINGOPTION SQL_Latin1_General_CP1_CI_AS
insert into ser.dbo.MembersNew
select *
from CSVTempData
您是否有可能直接从Excel数据导入?Excel将日期存储为浮点值,但SQL Server不知道如何处理。您的CSV应该使用
yyyy-MM-dd
导出,不仅仅是因为它在Excel中的格式,而是因为它在文件中的实际值。要在Excel中执行此操作,您需要(某些变体)文本(A1,“yyyy-MM-dd”)
(但格式字符串中使用的、
和字符都要进行本地化,这在Excel中是如此)。或者,导入浮点数,然后使用DATEADD(DAY,[value]-2,'1900-01-01')
转换为日期。不确定是否能够转换它,因为csv有40k条记录。是否有方法使用列本身转换它?批量插入无法自行转换。如果表中有FLOAT
列,则可以使用SELECT。。导入CsvDataFinal
以在导入数据后转换数据。或者,您可以使用SELECT。。从OPENROWSET(BULK..)
动态转换数据。(顺便说一句,对于SQL Server和Excel来说,4万行并不多。)