Работает ли предоставление коллекции XML-схем для хранимой процедуры с портом отправки WCF-SQL?
Рассмотрим следующую упрощенную коллекцию XML-схем
CREATE XML SCHEMA COLLECTION CD.AcceptMessageSchema AS '
<xs:schema xmlns="http://schemas.microsoft.com/Sql/2008/05/Procedures/Submit"
xmlns:ns1="http://schemas.microsoft.com/Sql/2008/05/Procedures/Submit"
xmlns:b="http://schemas.microsoft.com/BizTalk/2003"
targetNamespace="http://schemas.microsoft.com/Sql/2008/05/Procedures/Submit"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xs:element name="AcceptMessage">
<xs:complexType>
<xs:sequence>
<xs:element name="MessagePayload" type="xs:string"/>
<xs:element name="PatientIdentifiers">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" minOccurs="0" name="ID" type="ID">
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
и следующее определение хранимой процедуры
create procedureSubmit.AcceptMessage_DEV @AcceptMessage xml(CD.AcceptMessageSchema)
as
Insert into blah...
...stored proc guts go here...
Вы заметите, что определен один параметр, связанный с коллекцией схем. Я предполагал, что, учитывая связь с SchemaCollection, вы сможете вызвать хранимую процедуру, отправив что-то вроде следующего:
<AcceptMessage xmlns="http://schemas.microsoft.com/Sql/2008/05/Procedures/Submit" xmlns:biztalk="http://InteriorHealth.BizTalk.CDX.Schemas.SQLSubmit.AcceptMessage" xmlns:ns0="http://microsoft.com/HealthCare/HL7/2X" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<MessagePayload>
<![CDATA[somepayloaddata]]>
</MessagePayload>
<PatientIdentifiers>
<ID OID="2.16.840.1.113883.4.50" Value="3454545" AssigningAuthorityName="Patient Health Number" />
<ID OID="2.16.840.1.113883.3.277.1.73" Value="4545454" AssigningAuthorityName="Patient EMR Number" />
</PatientIdentifiers>
</AcceptMessage>
и он будет работать через порт отправки WCF-SQL.
Странно, если я вызываю хранимую процедуру в SSMS:
EXEC Submit.AcceptMessage @AcceptMessage = ' <AcceptMessage xmlns="http://schemas.microsoft.com/Sql/2008/05/Procedures/Submit" xmlns:biztalk="http://InteriorHealth.BizTalk.CDX.Schemas.SQLSubmit.AcceptMessage" xmlns:ns0="http://microsoft.com/HealthCare/HL7/2X" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<MessagePayload>
<![CDATA[somepayloaddata]]>
</MessagePayload>
<PatientIdentifiers>
<ID OID="2.16.840.1.113883.4.50" Value="3454545" AssigningAuthorityName="Patient Health Number" />
<ID OID="2.16.840.1.113883.3.277.1.73" Value="4545454" AssigningAuthorityName="Patient EMR Number" />
</PatientIdentifiers>
</AcceptMessage>';
он работает просто отлично, но отправляя его по проводам через WCF-SQL, я получаю сообщение об ошибке:
The start element with name "MessagePayload" and namespace "http://schemas.microsoft.com/Sql/2008/05/Procedures/Submit" was unexpected. Please ensure that your input XML conforms to the schema for the operation.
Это то же самое, что произошло бы до того, как я применил коллекцию XML Scheam и определил хранимый процесс следующим образом:
create procedureSubmit.AcceptMessage_DEV
@MessagePayload xml,
@PatientIdentifiers xml
as
Если бы я затем отправил запрос, как указано выше, он бы выдал ошибку:
The start element with name "ID" and namespace "http://schemas.microsoft.com/Sql/2008/05/Procedures/Submit" was unexpected. Please ensure that your input XML conforms to the schema for the operation.
Потому что он не знал, что делать с <ID>
элементы внутри <PatientIdentifiers>
элемент.
Ранее я оборачивал все данные параметров в теги CDATA, и это работало, но я хотел, чтобы добавленная проверка схемы работала.
Значит ли это, что при вызове WCF-SQL мне в основном приходится CDATA все внутри элементов параметра, или мне чего-то не хватает?
Кроме того, это решение только для обмена сообщениями, без оркестровки.
Как я могу отправить вложенный XML в процесс SQL Stored, чтобы проанализировать его и вставить данные в таблицы?
1 ответ
В этом конкретном случае я думаю, что параметр табличного значения будет проще.
Однако, чтобы ответить на ваш основной вопрос, вы можете передать параметр XML Type либо как CDATA, либо как экранированный Xml. Тип элемента схемы WCF всегда будет xs:string.
Вы генерируете схему для SP, правильно? Вы на самом деле не говорите.