June 05, 2009

XML Extractor



This query shows how to extract an array of values for a field inside of the XML string:

DECLARE @sInputList VARCHAR(MAX)
DECLARE @sDelimiter VARCHAR(MAX)
DECLARE @sDelimiter2 VARCHAR(MAX)

SET @sInputList = '<package><document copies="1" docgroupid="6" docid="1042" packagedocid="docd1042-0" rule="" selected="true" title="Document 1 - Doc Group: Group 1" xmlformid="-1"><document copies="1" docgroupid="4" docid="2189" packagedocid="docd2189-0" rule="" selected="true" title="Document 2 - Doc Group: Group 2" xmlformid="-1"><document copies="1" docgroupid="4" docid="78" packagedocid="docd78-0" rule="" selected="true" title="Document 3 - Doc Group: Group 2" xmlformid="-1"><document copies="1" docgroupid="4" docid="2122" packagedocid="docd2122-0" rule="" selected="true" title="Document 4 - Doc Group: Group 2" xmlformid="-1"><document copies="1" docgroupid="10" docid="2057" packagedocid="docd2057-0" rule="" selected="true" title="Document 5 - Doc Group: Package" xmlformid="-1"><document copies="1" docgroupid="10" docid="2055" packagedocid="docd2055-0" rule="" selected="true" title="Document 6 - Doc Group: Package" xmlformid="-1"><document copies="1" docgroupid="5" docid="873" packagedocid="docd873-0" rule="" selected="true" title="Document 7 - Doc Group: Group 3" xmlformid="-1"><document copies="1" docgroupid="5" docid="246" packagedocid="docd246-0" rule="" selected="true" title="Document 8 - Doc Group: Group 4" xmlformid="-1"><document copies="1" docgroupid="4" docid="1843" packagedocid="docd1843-0" rule="" selected="true" title="Document 9 - Doc Group: Group 2" xmlformid="-1"><document copies="1" docgroupid="4" docid="621" packagedocid="docd621-0" rule="" selected="true" title="Document 10 - Doc Group: Group 2" xmlformid="-1"><document copies="1" docgroupid="4" docid="230" packagedocid="docd230-0" rule="" selected="true" title="Document 11 - Doc Group: Group 2" xmlformid="-1"><document copies="1" docgroupid="4" docid="2152" packagedocid="docd2152-0" rule="" selected="true" title="Document 12 - Doc Group: Group 2" xmlformid="-1"><document copies="1" docgroupid="4" docid="2002" packagedocid="docd2002-0" rule="" selected="true" title="Document 13 - Doc Group: Group 2" xmlformid="-1"><document copies="1" docgroupid="4" docid="2153" packagedocid="docd2153-0" rule="" selected="true" title="Document 14 - Doc Group: Group 2" xmlformid="-1"></document></document></document></document></document></document></document></document></document></document></document></document></document></document></package>'
SET @sDelimiter = ' docID="'
SET @sDelimiter2 = '"'

IF CHARINDEX(@sDelimiter,@sInputList,0) <> 0
    SET @sInputList=RTRIM(LTRIM(SUBSTRING(@sInputList,CHARINDEX(@sDelimiter,@sInputList,0)+LEN(@sDelimiter),LEN(@sInputList)))) --) RETURNS @List TABLE (item VARCHAR(8000))

DECLARE @List TABLE (item VARCHAR(MAX))
DECLARE @sItem VARCHAR(8000)
WHILE CHARINDEX(@sDelimiter,@sInputList,0) <> 0
BEGIN
    SET @sItem=RTRIM(LTRIM(SUBSTRING(@sInputList,1,CHARINDEX(@sDelimiter,@sInputList,0)-1)))
    IF CHARINDEX(@sDelimiter2,@sItem,0) <> 0
    SET @sItem=RTRIM(LTRIM(SUBSTRING(@sItem,1,CHARINDEX(@sDelimiter2,@sItem,0)-1)))
    SET @sInputList=RTRIM(LTRIM(SUBSTRING(@sInputList,CHARINDEX(@sDelimiter,@sInputList,0)+LEN(@sDelimiter),LEN(@sInputList))))
    IF LEN(@sItem) > 0
    INSERT INTO @List SELECT @sItem
END

IF LEN(@sInputList) > 0
BEGIN
    SET @sInputList = RTRIM(LTRIM(SUBSTRING(@sInputList,1,CHARINDEX(@sDelimiter2,@sInputList,0)-1)))
    INSERT INTO @List SELECT @sInputList -- Put the last item in
END

SELECT * FROM @List

Bookmark and Share