从xml中的字符串转换日期和/或时间时转换失败

时间:2015-06-08 12:14:42

标签: sql xml datetime

我知道之前已经问过这类问题,但是这些问题都没有完全满足我的要求这里是我从xml插入数据到表中的简单代码但是连续给出错误..我已经将日期改为多种格式但是错误没有发生。

这是存储过程

ALTER PROCEDURE  [dbo].[SP_PCMarkAttendance]
    @XMLData xml,   
    @Result Bit output
AS
Begin
 Create table #tempMarkAttendance(
  StSubAssID numeric(18,0) ,  
  Dat Date,
  IsP Bit ,
  IsL Bit   
 ); 
 insert into #tempMarkAttendance(StSubAssID,Dat,IsP,IsL)
    Select 
    attendance.query('StSubAssID').value('.', 'numeric(18,0)') as StSubAssID,
    attendance.query('Dat').value('.', 'Date') as Dat,
    attendance.query('IsP').value('.', 'Bit') as IsP,  
    attendance.query('IsL').value('.', 'Bit') as IsL    
    FROM
    @XMLData.nodes('/StudentList/Student')AS xmlData(attendance)  

    select * from #tempMarkAttendance

set @Result  = 1

End

这里正在执行它。

DECLARE @return_value int,
        @Result bit

EXEC    @return_value = [dbo].[SP_PCMarkAttendance]     
        @XMLData = N'<?xml version="1.0" ?>
<StudentList>
<Student>
<StSubAssId>2</StSubAssId>
<Dat>
2014-01-01</Dat>
<IsP>False</IsP>
<IsL>False</IsL>
</Student>
</StudentList>',
        @Result = @Result OUTPUT

SELECT  @Result as N'@Result'
SELECT  'Return Value' = @return_value

GO

,错误是:

Msg 241, Level 16, State 1, Procedure SP_PCMarkAttendance, Line 13
Conversion failed when converting date and/or time from character string.

另一个错误是当我将StSubAssId的类型更改为数字(18,0)

Msg 8114, Level 16, State 5, Procedure SP_PCMarkAttendance, Line 12
Error converting data type nvarchar to numeric.

1 个答案:

答案 0 :(得分:1)

在您的source xml中,您在<Dat>元素的值中有额外的换行符:

<Dat>
2014-01-01</Dat>

所以实际上它的价值不是你期望的2014-01-01,而是char(13) + char(10) + '2014-01-01'

因此,您可以从原始xml中删除该换行符,或者(如果由于某种原因无法移除) - 您可以在存储过程中将此元素值设为varchar,而不是date,然后剥离换行符并投射到目前为止。

cast(replace(
      replace(
              attendance.query('Dat').value('.', 'nvarchar(20)'),
              char(13), ''), 
      char(10), '') 
as date)  as Dat