OPENXML пример чтения xml и запись в таблицу данных

Tsql теория > OPENXML пример чтения xml и запись в таблицу данных
01.02.2017 10:25:03



Статья:

 

Пример вызова .
declare @ID char(9) , @ErrString varchar(2000)
exec spВстреча_Создать @sXML=N''
<?xml version="1.0" encoding="windows-1251"?>
<ROOT Автор="io">
<CreateAppointment
ДатаРегистрации="2017-01-01"
АвторЭлемента_УИ="ID1"
Сотрудник_УИ="ID2"
Контрагент_УИ="konr_ID"
Контрагент_УИ_Строка="ID3"
ПотенциальнаяПрод_УИ="PP_ID"
Договор_УИ="dog_ID"
Тема="TEMA"
ДатаВстречи_Плано="2018-01-01"
Содержание="soderganie"
Результат="Results"
CODE="code"
DESCR="desc"
/>
</ROOT>'' ,@ID = @ID OUTPUT,@ErrString = @ErrString OUTPUT
select @ErrString,@ID

 

Сама  процедура


--<?xml version="1.0" encoding="windows-1251"?>
--<ROOT Автор="io">
-- <CreateAppointment
-- ДатаРегистрации="2017-01-01"
-- АвторЭлемента_УИ="ID1"
-- Сотрудник_УИ="ID2"
-- Контрагент_УИ="konr_ID"
-- Контрагент_УИ_Строка="ID3"
-- ПотенциальнаяПрод_УИ="PP_ID"
-- Договор_УИ="dog_ID"
-- Тема="TEMA"
-- ДатаВстречи_Плано="2018-01-01"
-- Содержание="soderganie"
-- Результат="Results"
-- CODE="code"
-- DESCR="desc"
-- />
-- </ROOT>
if exists (select * from sysobjects where id = object_id(''spВстреча_Создать'') and sysstat & 0xf = 4)
drop procedure spВстреча_Создать
go
CREATE PROCEDURE spВстреча_Создать
(
@sXML varchar(5000),
@ID char(9) OUTPUT,
@ErrString varchar(2000) OUTPUT

)

AS
Declare @ErrSave int, @RowCountSave int , @j int
DECLARE @Author_ID char(9)
DECLARE @Author_Account varchar(100)
DECLARE @idoc int
DECLARE @ДатаРегистрации datetime
DECLARE @АвторЭлемента_УИ char(9)
DECLARE @Сотрудник_УИ char(9)
DECLARE @Контрагент_УИ char(9)
DECLARE @Контрагент_УИ_Строка varchar(30)
DECLARE @ПотенциальнаяПрод_УИ char(9)
DECLARE @Договор_УИ char(9)
DECLARE @Тема varchar(30)
DECLARE @ДатаВстречи_Плано datetime
DECLARE @Содержание VARCHAR(8000)
DECLARE @Результат VARCHAR(8000)
DECLARE @CODE char(5)
DECLARE @DESCR varchar(100)

-- Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @sXML

--
SET @ErrSave = @@Error
IF @ErrSave<>0
BEGIN
set @ID = ''''
select @ErrString = description from master.dbo.sysmessages where error=@ErrSave
set @ErrString = ''Ошибка при подготовке XML документа. '' + @ErrString
RETURN @ErrSave
END
--

SELECT @Author_Account = upper(ltrim(rtrim(Автор)))
FROM OPENXML (@idoc, ''/ROOT'',1)
WITH (Автор varchar(100))

--
SET @ErrSave = @@Error
IF @ErrSave<>0
BEGIN
set @ID = ''''
select @ErrString = description from master.dbo.sysmessages where error=@ErrSave
set @ErrString = ''Ошибка при извлечении аккаунта автора. '' + @ErrString
RETURN @ErrSave
END
--

select @Author_ID = [ID] from sc0001 (NOLOCK) where upper(ltrim(rtrim(SP7538))) = @Author_Account

--
select @ErrSave = @@Error,@RowCountSave =@@RowCount
IF @ErrSave<>0
BEGIN
set @ID = ''''
select @ErrString = description from master.dbo.sysmessages where error=@ErrSave
set @ErrString = ''Ошибка при извлечении ID автора. '' + @ErrString
RETURN @ErrSave
END

IF @RowCountSave=0
BEGIN
set @ID = ''''
set @ErrString = ''Автор не найден. '' + isNull(@Author_Account,'''')
RETURN (-1)
END
--

-- извлечение данных о встрече node =CreateAppointment

SELECT
@ДатаРегистрации=isNull(convert(datetime,ДатаРегистрации,104),''1753-01-01'')
,@АвторЭлемента_УИ= isNull(АвторЭлемента_УИ,'' '')
,@Сотрудник_УИ= isNull(Сотрудник_УИ,'' '')
,@Контрагент_УИ= isNull(Контрагент_УИ,'' '')
,@Контрагент_УИ_Строка = isNull(Контрагент_УИ_Строка,'' '')
,@ПотенциальнаяПрод_УИ = isNull(ПотенциальнаяПрод_УИ,'' '')
,@Договор_УИ = isNull(Договор_УИ,'' '')
,@Тема= isNull(Тема,'' '')
,@ДатаВстречи_Плано =isNull(convert(datetime,ДатаВстречи_Плано,104),''1753-01-01'')
,@Содержание =CAST(Содержание AS VARCHAR(8000))
,@Результат =CAST(Результат AS VARCHAR(8000))
,@CODE=isNull(CODE,'' '')
,@DESCR=isNull(DESCR,'' '')

FROM OPENXML (@idoc, ''/ROOT/CreateAppointment'',1)
WITH ( ДатаРегистрации varchar(50),
АвторЭлемента_УИ char(9),
Сотрудник_УИ char(9),
Контрагент_УИ char(9),
Контрагент_УИ_Строка varchar(30),
ПотенциальнаяПрод_УИ char(9),
Договор_УИ char(9),
Тема varchar(30),
ДатаВстречи_Плано varchar(50),
Содержание VARCHAR(8000),
Результат VARCHAR(8000),
CODE char(5),
DESCR varchar(100)
)

--

select @ErrSave = @@Error,@RowCountSave =@@RowCount
EXEC sp_xml_removedocument @idoc
IF @ErrSave<>0
BEGIN
set @ID = ''''
select @ErrString = description from master.dbo.sysmessages where error=@ErrSave
set @ErrString = ''Ошибка при извлечении записи о встрече. '' + @ErrString
RETURN @ErrSave
END

IF @RowCountSave=0
BEGIN
set @ID = ''''
set @ErrString = ''В XML нет записи о встрече. ''
RETURN (-2)
END
IF @RowCountSave>1
BEGIN
set @ID = ''''
set @ErrString = ''В XML больше одной записи о встрече. ''
RETURN (-3)
END
--
-- Добавление данных Справочник CRM_Встреча

BEGIN TRANSACTION

EXEC [_1sp_SC0001_MaxID] @ID OUTPUT
set @ID=dbo.Convert10To36(dbo.Convert36To10(@ID) + 1)
SELECT @j =LEN(LTRIM(RTRIM(@ID)))
if @j <6
begin
SELECT @ID = ''''+SPACE(6-@j)+LTRIM(RTRIM(@ID))
end
INSERT INTO [SC0001]
(
[ID],
[ISMARK],
[CODE],
[DESCR],
[VERSTAMP],
[SP19485], --ДатаРегистрации
[SP19486], --АвторЭлемента
[SP19487], --Сотрудник
[SP19488], --Контрагент
[SP19489], --Контрагент_Строка
[SP19490], --ПотенциальнаяПрод
[SP19491], --Договор
[SP19492], --Тема
[SP19512], --ДатаВстречи_Плано
[SP19493], --Содержание
[SP19494] --Результат
)
VALUES(
@ID,
0,
@CODE,
@DESCR,
0,
@ДатаРегистрации,
@АвторЭлемента_УИ,
@Сотрудник_УИ,
@Контрагент_УИ,
@Контрагент_УИ_Строка,
@ПотенциальнаяПрод_УИ,
@Договор_УИ,
@Тема,
@ДатаВстречи_Плано,
@Содержание,
@Результат
)
--
select @ErrSave = @@Error,@RowCountSave =@@RowCount
IF @ErrSave<>0
BEGIN
set @ID = ''''
select @ErrString = description from master.dbo.sysmessages where error=@ErrSave
set @ErrString = ''Ошибка при добавлении в справочник'' + @ErrString
ROLLBACK TRANSACTION
RETURN @ErrSave
END

IF @RowCountSave=0
BEGIN
set @ID = ''''
set @ErrString = ''Ошибка при добавлении в справочник.''
ROLLBACK TRANSACTION
RETURN (-8)
END

--


COMMIT TRANSACTION
set @ErrString = ''''
Return @ErrSave


GO