This post has already been read 242 times!

This article illustrates how to call a web service using SQL Server Integration Services (SSIS), store the XML results in a SQL Server database table then query the XML using XQuery.

Introduction

Often enough, there is a huge benefit in knowing how to leverage SQL Server Integration Services to accomplish a data task that depends on a remote data source. This is a tutorial about a seemingly simple problem and solution that involves calling a web service from a SQL Server Integration Services package, storing the XML in an XML typed column in a SQL Server database table, then extracting the data using XQuery. Note that web services may also return JSON, which I'll explain and write a tutorial about later. This simple process and solution can be repeated to gather information from virtually any public web service. Use this method with care and purpose.

The problem I needed to solve was getting the city and state from incomplete address data where the only consistent information was the presence of a postal code. Parsing the string for the city and state was quickly ruled out because a city name can consist of 2 words, such as "Traverse City, MI". Of course, the postal codes were extracted from the string, which was simply because that data was at the end of every address and it was either 5 digits or 5 digits plus another 4 separated by a hyphen.

This tutorial is intended for intermediate to advanced database or SSIS developers. I include links to fundamental concepts that you should already know.

Here's an example of a few rows of data that came from an Excel worksheet sent to me by a business person. The actual contact and business names, as well as addresses, have been changed for confidentiality reasons.

figure_1_address_data_in_Excel

Steps

  1. Import the address data from Excel into a new or existing table.
  2. Add a column to that table or a new one to hold the postal codes. Go to Step 3
  3. Create a stored procedure to store the XML from the web service call. Go to Step 4
  4. Create a WSDL file. Go to Step 5
  5. Build and run the SSIS package. Go to Step 6
  6. Query the XML data using XQuery. Go to Step 7

Get Started

Step 1. Import the address data into a table

Unless you intend to save and reuse this component, simply use SQL Server Management Studio's Import and Export Wizard. For brevity, the detailed steps to accomplish this task are not included.

figure_2_import_export_wizard

Step 2. Add columns to that table or another to hold the postal codes and XML

Add a column to that table or a new one to hold the postal codes and XML returned from the web service call. For more information about the XML data type, see Implementing XML in SQL Server for more information.

figure_3_create_table_citydata

figure_4_create_table_webservicedata

Step 3. Create a stored procedure to get all of the postal codes

It's a best practice to use stored procedures so make it a habit if it isn't already.

figure_5_create_sp_pr_getpostalcodes

Step 4. Create a stored procedure to store the XML from the web service call

There are a number ways to check for an existing row first before attempting to insert one. The MERGE statement is great and can be written in such a way that performs exceptionally! Read more about the MERGE statement here: MERGE (Transact-SQL). Considering that I will not be saving this code for repeat use in a production environment, for simplicity, I used IF NOT EXISTS ...

figure_6_create_sp_pr_addcity

Step 5. Create a WSDL file

For instance, create an empty WSDL file named getcitybypostalcode.wsdl. This file will be used by the SSIS package in step 7. See Understanding WSDL for more information about Web Service Definition Description (WSDL) files.

In your working directory, right click, click "New" then click "Text Document". Name the file according (i.e. getcitybypostalcode.wsdl).

figure_7_wsdl_file

Step 6. Build and run the SSIS package

Step 6.1. For this project, I am using Visual Studio 2015 with Update 3 installed. Create a new Integration Services project and name it "Call Web Service".

figure_8_create_project

Step 6.2 Add a new connection manager to connect to your SQL Server instance and database. For various reasons that are not explained here, I've chosen to use the ADO.NET Connection Manager. OLE DB has been deprecated since SQL Server 2012. There are some great blog posts comparing the ODBC, OLE DB and ADO.NET connection managers. Here's one if you're interested in further reading on that topic: Click here

figure_9_adodotnet_connection_manager

Step 6.3. Add package variables city, postalCode and postalCodes with the following Data Types.

figure_10_package_variables

Step 6.5. Map the Execute SQL Task Result Set to the postalCode variable. Set the Result Name to zero ("0") as shown in figure 12.

figure_12_execute_sql_task_result_set

Step 6.6. Add a Foreach Loop Container then configure the Collection and Variable Mappings.

figure_13_foreach_loop_container

Step 6.7. Configure the Collection settings for the Foreach Loop Container.

figure_14_foreach_loop_container_collection

Step 6.8. Configure the Variable Mappings for the Foreach Loop Container. Use postalCode (singular) for each postal code in the postalCodes object.

figure_15_foreach_loop_container_variables

Next, add the Web Service Task that will be configured to call the GetInfoByZip web service for each postal code. The XML result for each call will be stored in the database. Let's take a look at the web service.
Step 6.9. Review and try out the public web service GetInfoByZip, which at the time of this writing is a free and public web service that returns the State Code, City, Area Code, Time Zone, and Zip Code by Zip Code as XML. There are several other methods available.

figure_16_web_service figure_17_web_service_result

Step 6.10. Create a new HTTP Connection Manager.

  1. Right click in the Connection Managers pane and click New Connection… and select HTTP.
  2. Click Add…
  3. Enter the Server URL to obtain the WSDL for the web service: http://webservicex.net/uszip.asmx?WSDL and click OK.

figure_14_foreach_loop_container_collection1

Step 6.11. Add a Web Service Task to the Foreach Loop Container. In the following steps, you're going to download and save the WSDL file and configure the Input and Output settings of the Web Service Task.

  1. On the General tab, for the HttpConnection property, select the HTTP Connection Manager created in the previous step.
  2. For the WSDLFile, click the ellipsis button and browse to the file created in step 5.
  3. Set the OverwriteWSDLFile property to True.
  4. Click the Download WSDL button. You should be prompted with a message box that reads, "The specified Web Services Description Language (WSDL) file was downloaded successfully." (See Figure 19 below)

figure_19_web_service_task figure_20_download_wsdl_file

Step 6.12. Configure the Input and Output properties for the Web Service Task.

  1. On the Input tab, set the Service property to USZip.
  2. Set the Method property to GetInfoByZip.
  3. Clicking the checkbox in the Variable column will switch the Value column to a dropdown list.
  4. Select User::postalCode.
  5. On the Output tab, using the dropdown list, set the OutputType to Variable.
  6. Using the dropdown list, set the Variable to User::city and click OK.

figure_21_web_service_task_input

Step 6.13. Add another Execute SQL Task and configure it to call the dbo.pr_AddCity stored procedure. Configure the sequence between the Web Service Task and the Execute SQL Task accordingly.

figure_22_execute_sql_task_no_2

Step 6.14. Configure the General tab of the Execute SQL Task.

figure_23_execute_sql_task_no_2_general

Step 6.15. Configure the Parameter Mapping properties of the Execute SQL Task. This is the last step before running the package. Then we'll query the data using XQuery.

  1. Click the Add button.
  2. Select User::city from the Variable Name dropdown list.
  3. Select Xml as the Data Type.
  4. Type "city" without the quotation marks as the Parameter Name and click OK.

figure_24_execute_sql_task_no_2_parameter_mapping figure_24_execute_sql_task_no_2_parameter_mapping3

Step 6.16. Before running the package, to see the package complete quickly, I recommend returning just 10 rows from the dbo.pr_GetPostalCodes stored procedure. Run the package.

figure_26_running_ssis_package

Step 7. Query the XML data using XQuery

Examine the results of the web service calls in table dbo.WebServiceData. Click on any row to see the XML in another tab as shown in figure 27.

figure_27_contents_of_webservicedata_table figure_28_xml_returned_by_getinfobyzip

Now, use XQuery to extract the data from its elements! Here are a couple of different XQuery methods.

figure_29_xquery_no_1

figure_30_xquery_no_1_results

figure_31_xquery_no_2

Source of this Article : https://www.codeproject.com/Articles/1182165/Call-a-Web-Service-using-SSIS-then-Store-and-Query

Leave a Reply

Post Navigation