even though u successfully loaded the raw xml into a table you still processed the data one row at a time. It is much better to use OPENXML and pivot the data.
example:
--TABLE TO HOLD THE RAW XML
DECLARE @tbl TABLE
(
ID INT, ParentID INT, NodeType INT, LocalName NVARCHAR(100), Prefix VARCHAR(50),
NameSpaceURI VARCHAR(50), DataType VARCHAR(50), Prev VARCHAR(50), [TEXT] NVARCHAR(200)
)
--xml in a variable of XML type that might be used in a proc or fnc
EXEC sp_xml_preparedocument @docHandle OUTPUT,@ItemsXML;
INSERT INTO @tbl(
ID ,ParentID ,NodeType ,LocalName,Prefix ,NameSpaceURI ,DataType ,Prev ,[TEXT]
)
SELECT * FROM OPENXML(@docHandle, '/PackageRequests/ItemRequest',1)
EXEC sp_xml_removedocument @docHandle
;
WITH CTE_Ranked AS (
SELECT
T1.LocalName
,T2.Text
,NTILE(12) OVER (PARTITION BY T1.LocalName ORDER BY T1.ID) AS RNKING
--NTILE Count defined by counting the largest number of possible records for any one column
--this could easily be a variable
FROM @tbl T1
INNER JOIN @Tbl T2
ON T1.ID = T2.ParentID
WHERE T1.LocalName IN ('VndID','LocID')
),
CTE_PIVOT_SOURCE AS (
SELECT
CTE_Ranked0.LocalName AS RLN
,CTE_Ranked0.text AS RIV
,CTE_Ranked01.RNKING
FROM CTE_Ranked CTE_Ranked0
INNER JOIN CTE_Ranked CTE_Ranked01 ON CTE_Ranked01.RNKING = CTE_Ranked0.RNKING
)
SELECT VendorID,LocationID
FROM CTE_PIVOT_SOURCE
PIVOT (
MIN(RIV)
FOR RLN IN (VndID,LocID)
) AS PivotTable