| The following sp accepts 3 parameters of type XML. It demonstrates creating tables in memory using ParamValues property and the nodes property of the XML data type. I leveraged the XML input parameters to provide a genericized and highly flexible manner to input tabular data. | |
An example of calling it is:
[BRIEF_SUMMARYSearch]
'c1', '<Regions><id>United States</id><id>Canada</id><id>Latin America</id></Regions>', '<segments><id>PR</id><id>CAC</id><id>DHS</id></segments>', '<status><id>Brief Denied</id><id>Draft</id><id>Edited</id></status>'CREATE PROCEDURE [dbo].[BRIEF_SUMMARYSearch]
(@regionIds AS xml, @segmentIds AS xml, @statusIds AS xml)
AS
BEGIN TRY
-- prepare region table
DECLARE @Regions TABLE (ID int)
INSERT INTO @Regions (ID) SELECT ParamValues.ID.value('.','VARCHAR(20)')
FROM @regionIds.nodes('/Regions/id') as ParamValues(ID)
-- prepare segment table
DECLARE @segments TABLE (ID int)
INSERT INTO @segments (ID) SELECT ParamValues.ID.value('.','VARCHAR(20)')
FROM @segmentIds.nodes('/segments/id') as ParamValues(ID)
-- prepare status table
DECLARE @status TABLE (ID int)
INSERT INTO @status (ID) SELECT ParamValues.ID.value('.','VARCHAR(20)')
FROM @statusIds.nodes('/status/id') as ParamValues(ID)
-- perform joins, ANDing the results
SELECT
--brsum_id
brsum_title as 'Brief Title'
,brsum_type as 'Brief Type'
,(select bc_campaign_name from BRIEF_CAMPAIGNS where bc_id = brsum_id) as 'Campaign'
,(select b_st_status_name from BRIEF_STATUS where b_st_id = brsum_status) as 'Status'
,(select DATEDIFF(day, brsum_date_added, getdate())) AS 'Pending'
,(select bupr_user_lastname from BRIEF_USER_PROFILES where bupr_user_id = brsum_creator) AS 'Creator'
,brsum_target_launch_date as 'Launch'
,(select br_region_name from BRIEF_REGIONS where br_id = brsum_region) as 'Region'
,(select bs_segment_name from BRIEF_SEGMENTS where bs_id = brsum_segment) as 'Segment'
FROM BRIEF_SUMMARY WHERE brsum_id IN
(
SELECT
brsum_id
FROM
BRIEF_SUMMARY
INNER JOIN
@Regions p
ON BRIEF_SUMMARY.brsum_region = p.ID
)
AND brsum_id IN
(
SELECT
brsum_id
FROM
BRIEF_SUMMARY
INNER JOIN
@segments p
ON BRIEF_SUMMARY.brsum_segment = p.ID
)
AND brsum_id IN
(
SELECT
brsum_id
FROM
BRIEF_SUMMARY
INNER JOIN
@status p
ON BRIEF_SUMMARY.brsum_status = p.ID
)
-- SENTIENCE
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER() as ERROR_NUMBER,
ERROR_SEVERITY() as ERROR_SEVERITY,
ERROR_STATE() as ERROR_STATE,
ERROR_MESSAGE() as ERROR_MESSAGE
END CATCH