I had a scenario where I was requesting several different complex xml documents from a SQL database to a BizTalk application. Returning xml from the stored procedures were used because of the relational structure of the data and to avoid having to use multiple maps to get to the final xml structure.
Instead of having to create new send ports for every query because of the response schemas where different for each request, I decided to use a composite schema that allowed me to use a single send port.
Below are the steps I used to go about developing the solution for BTS2009 and SQL2008. I will use the sample database AdventureWorks and will use a simple xml structure for each entity involved.
1. Create the required stored procedures
Create procedure [BTS].[Sel_Contacts_XML]
as
WITH XMLNAMESPACES ('http://BT.Composite.Schemas.WcfSQL/ContactResponse' as nsql1)
select Title,FirstName,LastName,EmailAddress
from Person.Contact
for XML PATH('nsql1:Contact')
Create procedure [BTS].[Sel_Products_XML]
as
WITH XMLNAMESPACES ('http://BT.Composite.Schemas.WcfSQL/ProductResponse' as nsql2)
select ProductNumber,Name,ListPrice
from Production.Product
for XML PATH('nsql2:Product')
2. Create the schemas for each stored procedure in the BizTalk project. Ensure that the target namespace matches the namespace defined in the stored procedure. For this example I called them ContactResponse and ProductResponse.
3. Create a new schema that will import the above schemas. This schema will be used as the common composite response schema for each of the WCF SQL requests.
Below is the final composite schema with the imported ContactResponse and ProductResponse schemas. Note that the target namespace and the root element of this composite schema will be specified in the WCF adaptor properties latter on.
4. Create the orchestration to call the stored procedures. Note there is only one send port but there is a separate operation for each stored procedure. Each operation was created manually and the name of the operation is important as it is used in the soap action header configuration latter.
For this demonstration the orchestration requested all the contacts first from the database and wrote the response to a file, then a second request was made to the database for the products and the response written to a file also.
5. Once the application is deployed to BizTalk, the WCF Custom adaptor must be configured.
When using stored procedures that output XML, the action property must be defined as following. XmlProcedure/<schema_name>/<procedure_name>
The operation name must match the name of the operation inside the orchestration
Below is the Action operation. Note the two operations that match port operation in the orchestration.
<BtsActionMapping xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Operation Name="SelContacts_OP" Action="XmlProcedure/BTS/Sel_Contacts_XML" />
<Operation Name="SelProducts_OP" Action="XmlProcedure/BTS/Sel_Products_XML" />
</BtsActionMapping>
Next the binding properties for using stored procedures outputting xml must be set to the target namespace and the root name of the composite schema that was created.
This is sample output extract of the first request for the Contacts.
And this is the output from the second request for the products.