我知道之前已经问过这类问题,但是这些问题都没有完全满足我的要求这里是我从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.
答案 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