2015-06-08 2 views
0

Я знаю, что этот тип вопросов был задан раньше, но ни один из них не заполняет мои требования. Вот мой простой код для вставки данных в таблицу из xml, но давая ошибку непрерывно ..i изменили дату на многие форматы, но ошибка не пошла.преобразование не удалось при преобразовании даты и/или времени из символьной строки в 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

В исходном XML у вас есть дополнительный разрыв строки в значение <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 
+0

Спасибо дружище .. проблема решена –

+0

у меня есть еще одна проблема, когда я изменил тип из StSubAssId в числовой (18,0) он дает мне ошибку –

+0

@AdnanAli Я думаю, что причина того, что «другой ошибки» является факт, что вы используете 'StSubAssId' в исходном xml, но запрашиваете его как' StSubAssID' (обратите внимание на «D» в «ID»). Таким образом, ваш запрос возвращает пустую строку (но не null) и исключение генерируется при преобразовании пустой строки в числовой. –

Смежные вопросы

 Смежные вопросы