У меня есть ответ SOAP и нужно импортировать в SQL Server почти все поля soapenv: Body googleing and testing Я строю этот запрос, который кажется рабочим , но это не совсем то, что я ищет:Полностью импортировать SOAP XML в SQL Server 2012
declare
@Root varchar(50)='/soap:Envelope/soap:Body/GetFeedbackResponse/',
@xDoc XML = '<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Header>
<ebl:RequesterCredentials soapenv:mustUnderstand="0" xmlns:ns="urn:ebay:apis:eBLBaseComponents" xmlns:ebl="urn:ebay:apis:eBLBaseComponents">
<ebl:NotificationSignature xmlns:ebl="urn:ebay:apis:eBLBaseComponents">r6revSiTXCP9SBBFUtpDAQ==</ebl:NotificationSignature>
</ebl:RequesterCredentials>
</soapenv:Header>
<soapenv:Body>
<GetFeedbackResponse xmlns="urn:ebay:apis:eBLBaseComponents">
<Timestamp>2015-09-06T11:20:48.528Z</Timestamp>
<Ack>Success</Ack>
<CorrelationID>428163922470</CorrelationID>
<Version>899</Version>
<Build>E899_INTL_APIFEEDBACK_17278558_R1</Build>
<NotificationEventName>Feedback</NotificationEventName>
<RecipientUserID>ebay_bestseller</RecipientUserID>
<EIASToken>nY+sHZ2PrBmdj6wVnY+sEWDETj2dj6AFlIajDpaEpAydj6x9nY+seQ==</EIASToken>
<FeedbackDetailArray>
<FeedbackDetail>
<CommentingUser>ebay_bestseller</CommentingUser>
<CommentingUserScore>42425</CommentingUserScore>
<CommentText>Great buyer - We Would Appreciate 5 STARS for Our Feedback!</CommentText>
<CommentTime>2015-09-06T11:20:45.000Z</CommentTime>
<CommentType>Positive</CommentType>
<ItemID>310541589307</ItemID>
<Role>Buyer</Role>
<FeedbackID>1064451206013</FeedbackID>
<TransactionID>549674542021</TransactionID>
<OrderLineItemID>310541589307-549674542021</OrderLineItemID>
</FeedbackDetail>
</FeedbackDetailArray>
<FeedbackDetailItemTotal>1</FeedbackDetailItemTotal>
<FeedbackScore>126</FeedbackScore>
<PaginationResult>
<TotalNumberOfPages>1</TotalNumberOfPages>
<TotalNumberOfEntries>1</TotalNumberOfEntries>
</PaginationResult>
<EntriesPerPage>25</EntriesPerPage>
<PageNumber>1</PageNumber>
</GetFeedbackResponse>
</soapenv:Body>
</soapenv:Envelope>'
;with xmlnamespaces('http://schemas.xmlsoap.org/soap/envelope/' as [soap], default 'urn:ebay:apis:eBLBaseComponents')
insert into Test (TS,Comment)
select
@xDoc.value('(/soap:Envelope/soap:Body/GetFeedbackResponse/Timestamp)[1]', 'nvarchar(max)'),
@xDoc.value('(/soap:Envelope/soap:Body/GetFeedbackResponse/FeedbackDetailArray/FeedbackDetail/CommentText)[1]', 'nvarchar(max)'),
........
Первый вопрос: так как есть ответ некоторые 50 различных мыл, а некоторые имеют до 120 Fiels, я искал решения, которые сплющить все поля и импорт автоматически в относительной таблице withoud требуя указать все строки: учитывая, что я использую sqlServer 2012/2014, есть ли решение, или если нет, есть лучший/более быстрый способ, чем то, что я поддерживаю osed?
Второе: (если нет лучшего решения) , так как у меня есть много полей для импорта, до 120 для некоторых SOAP, а так как root всегда один и тот же, я хотел бы уменьшить длину, помещая в переменную первая часть пути так, чтобы иметь , например
@xDoc.value('('[email protected]+'Timestamp)[1]', 'nvarchar(max)')
вместо
@xDoc.value('(/soap:Envelope/soap:Body/GetFeedbackResponse/Timestamp)[1]', 'nvarchar(max)')
, но я получаю ошибку, как первое значение должно быть буквенное значение: есть ли поворот?
Третье: из документации ... необходимо, чтобы запрос
@xDoc.value('(/soap:Envelope/soap:Body/GetFeedbackResponse/Timestamp)[1]', 'nvarchar(max)')
возвращает значение, в противном случае вызовет ошибку , но в некоторых мыл некоторые поля являются опциями, и поэтому не всегда присутствует: I пытался с
;with xmlnamespaces('http://schemas.xmlsoap.org/soap/envelope/' as [soap], default 'urn:ebay:apis:eBLBaseComponents')
insert into Test (TS,Comment)
select if (exists @xDoc.value('(/soap:Envelope/soap:Body/GetFeedbackResponse/Timestamp)')) then @xDoc.value('(/soap:Envelope/soap:Body/GetFeedbackResponse/Timestamp)[1]', 'nvarchar(max)')
....
но возникает ошибка: правильная форма запроса?
Большое спасибо
Джо
OK это решение намного проще, чем мое, и получить практически все данные .. но слишком сложно для меня понять мои текущие знания, и я не знаю, как идти дальше, поэтому я испытываю соблазн попросить дальнейшую помощь , в глубину: для этого SOAP наиболее важные поля находятся внутри FeedbackDetail, в то время как у меня есть NULL: как получить эту информацию? С динамическим стержнем вы предложили? Могут дать некоторые дополнительные намеки? А как насчет того, чтобы избежать некоторых полей? что-то проще, чем 'WHERE TXvalue ('local-name (.)', 'nvarchar (100)') <> 'Версия' или' NOT IN ('', '') 'Наконец, как создать запрос динамического обновления ? – Joe
Думаете, что одно решение для основной проблемы может быть интегрировано в функцию xQuery 'leaf-elements'? - это правильное направление? – Joe
@Joe Ваш лучший выбор - это, вероятно, продолжение пути, на котором вы уже были. Я добавил способ построить этот запрос, немного отличающийся от того, что у вас есть, и, возможно, проще в форме. –