我将CSV中的数据插入SQL Server。
表Tbl_art_tmp
是:
Art nchvar(50)
Qty nvarchar(50)
importedDate nvarchar(50)
要插入的SQL查询
BULK INSERT Tbl_Art_tmp
FROM 'ExportArt.CSV'
WITH
(FIRSTROW = 1,
FIELDTERMINATOR = ';',
ROWTERMINATOR='0x0a');
从其他软件导出的csv包含
Art;Qty;importedDate
10203R04-04; 0;2015-10-21
10407T-10-100; 9;2016-02-01
我想更新另一个表Tbl_art
,表格:
art nvarchar(30)
Qty real
lastUpdate datetime
我的SQL查询:
UPDATE a
SET a.[qty] = CAST(atemp.[Qty] AS REAL),
a.[lastUpdate] = CAST(atemp.[importedDate] AS DATETIME)
FROM [Tbl_Art] a
JOIN [Tbl_art_tmp] atemp ON a.[art] = atemp.[Art];
数量更新可以,而不是日期时间转换
Msg 241,Level 16,State 1,Line 3
从字符串转换日期和/或时间时转换失败。
感谢您的帮助
答案 0 :(得分:0)
尝试使用CONVERT(DATETIME,atemp.[importedDate ],102)
btw:columnName“importedDate”后面是否真的有空格?
您遇到的问题可能与文化/语言有关。
您可能会阅读此https://stackoverflow.com/a/34275965/5089204
Convert
允许您指定专用格式。 cast
只会尝试使用您的默认值
答案 1 :(得分:0)
由于 Marc_s 已经回答here
SQL Server支持多种格式 - 请参阅MSDN Books Online on CAST and CONVERT。大多数格式都是依赖你所拥有的设置 - 因此,这些设置可能会有效 - 有时也不会。
解决此问题的方法是使用SQL Server支持的(略微调整的) ISO-8601日期格式 - 此格式始终 - 无论您的是什么SQL Server语言和日期格式设置。
SQL Server支持ISO-8601 format有两种形式:
YYYYMMDD
仅适用于日期(无时间部分);请注意:没有破折号!,这非常重要! YYYY-MM-DD
不独立于SQL Server中的dateformat设置, NOT 可以在所有情况下使用!或:
YYYY-MM-DDTHH:MM:SS
了解日期和时间 - 请注意:此格式有破折号(但可以可以省略),还有一个固定的T
作为DATETIME
的日期和时间部分之间的分隔符。这适用于SQL Server 2000及更高版本。
所以在你的具体案例中 - 使用这些字符串:
insert into table1 values('2012-02-21T18:10:00', '2012-01-01T00:00:00');
你应该没事(注意:你需要使用国际 24小时格式而不是12小时AM / PM格式)。
或者:如果您使用的是SQL Server 2008 或更新版本,您还可以使用DATETIME2
数据类型(而不是普通DATETIME
)和你当前的INSERT
只会毫无问题地工作! :-) DATETIME2
要好得多,转换时也不那么挑剔 - 而且无论如何它都是SQL Server 2008或更新版本的推荐日期/时间数据类型。
SELECT
CAST('02-21-2012 6:10:00 PM' AS DATETIME2), -- works just fine
CAST('01-01-2012 12:00:00 AM' AS DATETIME2) -- works just fine
不要问我为什么这整个话题如此棘手而且有点令人困惑 - 这就是它的方式。但是使用YYYYMMDD
格式,您可以适用于任何版本的SQL Server以及SQL Server中的任何语言和日期格式设置。
答案 2 :(得分:0)
我似乎是csv文件的错误... 它在日期之后包含一个空格 我使用SSIS包来安排导入,他没有任何问题地处理转换 谢谢