数据输入:
<F1>000001234</F1> <F2>133228579</F2> <F3>2011-05-25</F3> <F4>21-332211</F4> <F5>TxtMail</F5> <F6/> <F7>26/04/2011</F7> <F8>00:09:13</F8> <F9>0:00</F9> <F10/> <F11/> <F12>Text Service</F12> <F13>0294443333</F13> <F14>TXT</F14> <F15>FR</F15> <F16>0.17</F16>
存储过程的相关部分:
@F1 VARCHAR(24) = NULL, --AccountNumber @F2 VARCHAR(24) = NULL, --InvoiceNumber @F3 VARCHAR(24) = NULL, --InvoiceDate @F4 VARCHAR(24) = NULL, --CallerNumber @F5 VARCHAR(10) = NULL, --Service @F6 VARCHAR(10) = NULL, -- @F7 varchar(24) = NULL, --CallDate @F8 VARCHAR(24) = NULL, --CallTime @F9 VARCHAR(50) = NULL, --Duration @F10 VARCHAR(50) = NULL, -- @F11 VARCHAR(10) = NULL, -- @F12 VARCHAR(24) = NULL, --Network @F13 VARCHAR(24) = NULL, --CallingNumber @F14 VARCHAR(10) = NULL, --Type @F15 VARCHAR(10) = NULL, --TypeName @F16 MONEY = NULL, --Amount DECLARE @Date VARCHAR(20) SET @Date = RIGHT(@F7,4)+'/'+SUBSTRING(@F7,4,2)+'/'+LEFT(@F7,2) -- Combine the date and time into a datetime data type -- For Time DECLARE @time DATETIME SET @time = CONVERT(DATETIME, @Date + ' ' + @F8)
错误:将varchar数据类型转换为datetime数据类型导致值超出范围。
这是CONVERT(DATETIME)的唯一调用,并且我不使用CAST
如果我只是直接传递数据,则会插入该行。如果我运行该存储过程,它将超出范围。
在SQL Server中使用的安全日期时间字符串格式为
YYYYMMDD HH:MM:SS或YYYY-MM-DDTHH:MM:SS。
YYYYMMDD HH:MM:SS
YYYY-MM-DDTHH:MM:SS
如果SET DATEFORMAT为dmy,则转换将失败。设置语言将自动为您设置日期格式。我认为无论是german和norwegian使用DMY。
german
norwegian
这将失败:
set language norwegian declare @F7 varchar(10) = '26/04/2011' declare @F8 varchar(10) = '00:09:13' DECLARE @Date VARCHAR(20) SET @Date = RIGHT(@F7,4)+'/'+SUBSTRING(@F7,4,2)+'/'+LEFT(@F7,2) DECLARE @time DATETIME SET @time = CONVERT(DATETIME, @Date + ' ' + @F8)
无论使用哪种语言/日期格式设置,都应这样做(使用YYYY-MM-DDTHH:MM:SS)以确保安全。
declare @F7 varchar(10) = '26/04/2011' declare @F8 varchar(10) = '00:09:13' DECLARE @Date VARCHAR(20) SET @Date = RIGHT(@F7,4)+'-'+SUBSTRING(@F7,4,2)+'-'+LEFT(@F7,2) DECLARE @time DATETIME SET @time = CONVERT(DATETIME, @Date + 'T' + @F8)