Forum Discussion
0105
Jan 24, 2025Copper Contributor
Using XQUERY on complicated XML
Hi All, and thanks in advance for any help you can provide.
I'm currently working on SSMS v20 and am trying to parse XML in SQL Server using XQUERY. I've looked at dozens of examples, tutorials, etc., but every one has such simplistic XML that I can't figure out how to do it on my more complicated (more levels) XML. Here is a sample of data in an XML column:
<dcjis:DataExchange xmlns:dcjis="http://www.xfact.com/schemas/eopss/dcjis/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dcjis-ext="http://www.xfact.com/schemas/eopss/dot-ec/1.0/extension" xmlns:dot-ec="http://www.xfact.com/schemas/eopss/dot-ec/1.0/extension" xmlns:nc="http://niem.gov/niem/niem-core/2.0" xmlns:j="http://niem.gov/niem/domains/jxdm/4.0" xmlns:s="http://niem.gov/niem/structures/2.0">
<dot-ec:Vehicle s:id="vehicle1">
<nc:VehicleColorPrimaryCode>BLU</nc:VehicleColorPrimaryCode>
<nc:ItemMakeName>VOLK</nc:ItemMakeName>
<nc:ItemModelName>JETTA</nc:ItemModelName>
<nc:ItemModelYearDate>2011</nc:ItemModelYearDate>
<nc:VehicleCMVIndicator>false</nc:VehicleCMVIndicator>
<nc:ConveyanceRegistration>
<nc:ConveyanceRegistrationPlateIdentification>
<nc:IdentificationID>194JM4</nc:IdentificationID>
<nc:IdentificationExpirationDate>
<nc:Date>2020-04-30</nc:Date>
</nc:IdentificationExpirationDate>
<j:DrivingJurisdictionAuthorityANSID20Code>MA</j:DrivingJurisdictionAuthorityANSID20Code>
<nc:IdentificationJurisdictionFIPS10-4Code>US</nc:IdentificationJurisdictionFIPS10-4Code>
</nc:ConveyanceRegistrationPlateIdentification>
<dot-ec:VehiclePlateTypeCode>PAN</dot-ec:VehiclePlateTypeCode>
<dot-ec:VehiclePlateTypeText>Passenger Normal</dot-ec:VehiclePlateTypeText>
</nc:ConveyanceRegistration>
<dot-ec:VehiclePassenger16PlusIndicator>false</dot-ec:VehiclePassenger16PlusIndicator>
<dot-ec:HazMatPlacardDisplayedIndicator>false</dot-ec:HazMatPlacardDisplayedIndicator>
<dot-ec:VehicleRegistrationUnknownIndicator>false</dot-ec:VehicleRegistrationUnknownIndicator>
<nc:InsuranceCarrierName>GOVT EMPLOYEE INS</nc:InsuranceCarrierName>
</dot-ec:Vehicle>
</dcjis:DataExchange>
Thanks.
Is this what you want?
Replace the table name (#test) to your table that contain xml column, and replace column name(xml_data) to your xml column name, then you can try to run the script.WITH XMLNAMESPACES( 'http://www.xfact.com/schemas/eopss/dcjis/1.0' AS dcjis ,'http://www.xfact.com/schemas/eopss/dot-ec/1.0/extension' AS dot_ec ,'http://niem.gov/niem/niem-core/2.0' AS nc ,'http://niem.gov/niem/domains/jxdm/4.0' AS j ,'http://niem.gov/niem/structures/2.0' AS s) SELECT t.id, --assume your table has a key named id. You can replace it with your key column or just comment this line VehicleNode.value(N'(@s:id)', 'nvarchar(20)') as V_ID ,VehicleNode.value(N'(nc:VehicleColorPrimaryCode)[1]', 'nvarchar(20)') as ColorPrimaryCode ,VehicleNode.value(N'(nc:ItemMakeName)[1]', 'nvarchar(20)') as MakeName ,VehicleNode.value(N'(nc:ItemModelName)[1]', 'nvarchar(20)') as ModelName ,VehicleNode.value(N'(nc:ItemModelYearDate)[1]', 'nvarchar(4)') as ModelYear ,VehicleNode.value(N'(nc:VehicleCMVIndicator)[1]', 'nvarchar(10)') as CMVIndicator ,RegNode.value(N'(nc:ConveyanceRegistrationPlateIdentification/nc:IdentificationID)[1]','nvarchar(20)') as ConveyanceRegistrationPlateIdentification ,RegNode.value(N'(nc:ConveyanceRegistrationPlateIdentification/nc:IdentificationExpirationDate/nc:Date)[1]','date') as ConveyanceRegistrationExpirationDate ,RegNode.value(N'(nc:ConveyanceRegistrationPlateIdentification/j:DrivingJurisdictionAuthorityANSID20Code)[1]','nvarchar(10)') as DrivingJurisdictionAuthorityANSID20Code ,RegNode.value(N'(nc:ConveyanceRegistrationPlateIdentification/nc:IdentificationJurisdictionFIPS10-4Code)[1]','nvarchar(10)') as IdentificationJurisdictionFIPS10_4Code ,RegNode.value(N'(dot_ec:VehiclePlateTypeCode)[1]','nvarchar(10)') as VehiclePlateTypeCode ,RegNode.value(N'(dot_ec:VehiclePlateTypeText)[1]','nvarchar(10)') as VehiclePlateTypeText ,VehicleNode.value(N'(dot_ec:VehiclePassenger16PlusIndicator)[1]' ,'nvarchar(10)') as VehiclePassenger16PlusIndicator ,VehicleNode.value(N'(dot_ec:HazMatPlacardDisplayedIndicator)[1]', 'nvarchar(10)') as HazMatPlacardDisplayedIndicator ,VehicleNode.value(N'(dot_ec:VehicleRegistrationUnknownIndicator)[1]', 'nvarchar(10)') as VehicleRegistrationUnknownIndicator ,VehicleNode.value(N'(nc:InsuranceCarrierName)[1]', 'nvarchar(20)') as InsuranceCarrierName FROM #test t --Replace "#test" with your table name CROSS APPLY t.xml_data.nodes('/dcjis:DataExchange/dot_ec:Vehicle') AS V(VehicleNode) --Replace "xml_data" with your xml column name CROSS APPLY VehicleNode.nodes('nc:ConveyanceRegistration') AS R(RegNode) WHERE xml_data is not null; --Replace "xml_data" with your xml column name
- 0105Copper Contributor
I also have this XML which is structured differently than the others, and I can't get XQUERY to work:
<dcjis:DataExchange xmlns:dcjis="http://www.xfact.com/schemas/eopss/dcjis/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dcjis-ext="http://www.xfact.com/schemas/eopss/dot-ec/1.0/extension" xmlns:dot-ec="http://www.xfact.com/schemas/eopss/dot-ec/1.0/extension" xmlns:nc="http://niem.gov/niem/niem-core/2.0" xmlns:j="http://niem.gov/niem/domains/jxdm/4.0">
<dcjis-ext:DataElements>
<dcjis-ext:DataElement dcjis-ext:elementName="citationNo">039849AA</dcjis-ext:DataElement>
<dcjis-ext:DataElement dcjis-ext:elementName="citationDate">2017-12-17</dcjis-ext:DataElement>
<dcjis-ext:DataElement dcjis-ext:elementName="resultOfStopCode">P</dcjis-ext:DataElement>
<dcjis-ext:DataElement dcjis-ext:elementName="resultOfStopText">CMVI Payable</dcjis-ext:DataElement>
<dcjis-ext:DataElement dcjis-ext:elementName="violatorTypeCode">1</dcjis-ext:DataElement>
<dcjis-ext:DataElement dcjis-ext:elementName="violatorTypeText">Operator</dcjis-ext:DataElement>
<dcjis-ext:DataElement dcjis-ext:elementName="citationVoidedInd">false</dcjis-ext:DataElement>
<dcjis-ext:DataElement dcjis-ext:elementName="plateReaderInd">false</dcjis-ext:DataElement>
<dcjis-ext:DataElement dcjis-ext:elementName="licenseStateCode">MA</dcjis-ext:DataElement>
<dcjis-ext:DataElement dcjis-ext:elementName="licenseStateText">Massachusetts, USA</dcjis-ext:DataElement>
<dcjis-ext:DataElement dcjis-ext:elementName="birthYear">1956</dcjis-ext:DataElement>
<dcjis-ext:DataElement dcjis-ext:elementName="sexCode">F</dcjis-ext:DataElement>
<dcjis-ext:DataElement dcjis-ext:elementName="sexText">FEMALE</dcjis-ext:DataElement>
<dcjis-ext:DataElement dcjis-ext:elementName="raceCode">W</dcjis-ext:DataElement>
<dcjis-ext:DataElement dcjis-ext:elementName="raceText">WHITE</dcjis-ext:DataElement>
<dcjis-ext:DataElement dcjis-ext:elementName="vehiclePlateStateCode">MA</dcjis-ext:DataElement>
<dcjis-ext:DataElement dcjis-ext:elementName="vehiclePlateStateText">Massachusetts, USA</dcjis-ext:DataElement>
<dcjis-ext:DataElement dcjis-ext:elementName="vehiclePlateTypeCode">PAN</dcjis-ext:DataElement>
<dcjis-ext:DataElement dcjis-ext:elementName="vehiclePlateTypeText">PASSENGER NORMAL</dcjis-ext:DataElement>
<dcjis-ext:DataElement dcjis-ext:elementName="locationCityCode">004</dcjis-ext:DataElement>
<dcjis-ext:DataElement dcjis-ext:elementName="locationCityText">Worcester</dcjis-ext:DataElement>
<dcjis-ext:DataElement dcjis-ext:elementName="locationRoadwayTypeCode">1</dcjis-ext:DataElement>
<dcjis-ext:DataElement dcjis-ext:elementName="locationRoadwayTypeText">Secondary Roadway</dcjis-ext:DataElement>
<dcjis-ext:DataElement dcjis-ext:elementName="searchInd">false</dcjis-ext:DataElement>
<dcjis-ext:DataElement dcjis-ext:elementName="issuingAgencyCode">C6</dcjis-ext:DataElement>
<dcjis-ext:DataElement dcjis-ext:elementName="issuingAgencyText">State Police Troop C-6</dcjis-ext:DataElement>
<dcjis-ext:DataElement dcjis-ext:elementName="issuingOfficerFirstName">RONALD</dcjis-ext:DataElement>
<dcjis-ext:DataElement dcjis-ext:elementName="issuingOfficerMiddleName">Q</dcjis-ext:DataElement>
<dcjis-ext:DataElement dcjis-ext:elementName="issuingOfficerLastName">WILson</dcjis-ext:DataElement>
<dcjis-ext:DataElement dcjis-ext:elementName="issuingOfficerIdNo">3732</dcjis-ext:DataElement>
<dcjis-ext:DataElement dcjis-ext:elementName="activityCode">P</dcjis-ext:DataElement>
<dcjis-ext:DataElement dcjis-ext:elementName="activityText">Patrol</dcjis-ext:DataElement>
<dcjis-ext:DataElement dcjis-ext:elementName="verbalWarningInd">false</dcjis-ext:DataElement>
</dcjis-ext:DataElements>
</dcjis:DataExchange>Any help would be greatly appreciated.
- rodgerkongIron Contributor
WITH XMLNAMESPACES( 'http://www.xfact.com/schemas/eopss/dcjis/1.0' AS dcjis ,'http://www.xfact.com/schemas/eopss/dot-ec/1.0/extension' AS dcjis_ext ,'http://www.xfact.com/schemas/eopss/dot-ec/1.0/extension' AS dot_ec ,'http://niem.gov/niem/niem-core/2.0' AS nc ,'http://niem.gov/niem/domains/jxdm/4.0' AS j ) SELECT t.id ,DataNode.value(N'(dcjis_ext:DataElement[@dcjis_ext:elementName="citationNo"][1])', 'nvarchar(20)') as citationNo ,DataNode.value(N'(dcjis_ext:DataElement[@dcjis_ext:elementName="citationDate"][1])', 'date') as citationDate ,DataNode.value(N'(dcjis_ext:DataElement[@dcjis_ext:elementName="resultOfStopCode"][1])', 'nvarchar(2)') as resultOfStopCode ,DataNode.value(N'(dcjis_ext:DataElement[@dcjis_ext:elementName="resultOfStopText"][1])', 'nvarchar(20)') as resultOfStopText ,DataNode.value(N'(dcjis_ext:DataElement[@dcjis_ext:elementName="violatorTypeCode"][1])', 'nvarchar(2)') as violatorTypeCode ,DataNode.value(N'(dcjis_ext:DataElement[@dcjis_ext:elementName="violatorTypeText"][1])', 'nvarchar(20)') as violatorTypeText ,DataNode.value(N'(dcjis_ext:DataElement[@dcjis_ext:elementName="citationVoidedInd"][1])', 'nvarchar(10)') as citationVoidedInd ,DataNode.value(N'(dcjis_ext:DataElement[@dcjis_ext:elementName="plateReaderInd"][1])', 'nvarchar(10)') as plateReaderInd ,DataNode.value(N'(dcjis_ext:DataElement[@dcjis_ext:elementName="licenseStateCode"][1])', 'nvarchar(2)') as licenseStateCode ,DataNode.value(N'(dcjis_ext:DataElement[@dcjis_ext:elementName="licenseStateText"][1])', 'nvarchar(20)') as licenseStateText ,DataNode.value(N'(dcjis_ext:DataElement[@dcjis_ext:elementName="birthYear"][1])', 'nvarchar(4)') as birthYear ,DataNode.value(N'(dcjis_ext:DataElement[@dcjis_ext:elementName="sexCode"][1])', 'nvarchar(2)') as sexCode ,DataNode.value(N'(dcjis_ext:DataElement[@dcjis_ext:elementName="sexText"][1])', 'nvarchar(20)') as sexText ,DataNode.value(N'(dcjis_ext:DataElement[@dcjis_ext:elementName="raceCode"][1])', 'nvarchar(2)') as raceCode ,DataNode.value(N'(dcjis_ext:DataElement[@dcjis_ext:elementName="raceText"][1])', 'nvarchar(20)') as raceText ,DataNode.value(N'(dcjis_ext:DataElement[@dcjis_ext:elementName="vehiclePlateStateCode"][1])', 'nvarchar(2)') as vehiclePlateStateCode ,DataNode.value(N'(dcjis_ext:DataElement[@dcjis_ext:elementName="vehiclePlateStateText"][1])', 'nvarchar(20)') as vehiclePlateStateText ,DataNode.value(N'(dcjis_ext:DataElement[@dcjis_ext:elementName="vehiclePlateTypeCode"][1])', 'nvarchar(2)') as vehiclePlateTypeCode ,DataNode.value(N'(dcjis_ext:DataElement[@dcjis_ext:elementName="vehiclePlateTypeText"][1])', 'nvarchar(20)') as vehiclePlateTypeText ,DataNode.value(N'(dcjis_ext:DataElement[@dcjis_ext:elementName="locationCityCode"][1])', 'nvarchar(4)') as locationCityCode ,DataNode.value(N'(dcjis_ext:DataElement[@dcjis_ext:elementName="locationCityText"][1])', 'nvarchar(20)') as locationCityText ,DataNode.value(N'(dcjis_ext:DataElement[@dcjis_ext:elementName="locationRoadwayTypeCode"][1])', 'nvarchar(2)') as locationRoadwayTypeCode ,DataNode.value(N'(dcjis_ext:DataElement[@dcjis_ext:elementName="locationRoadwayTypeText"][1])', 'nvarchar(20)') as locationRoadwayTypeText ,DataNode.value(N'(dcjis_ext:DataElement[@dcjis_ext:elementName="searchInd"][1])', 'nvarchar(10)') as searchInd ,DataNode.value(N'(dcjis_ext:DataElement[@dcjis_ext:elementName="issuingAgencyCode"][1])', 'nvarchar(2)') as issuingAgencyCode ,DataNode.value(N'(dcjis_ext:DataElement[@dcjis_ext:elementName="issuingAgencyText"][1])', 'nvarchar(20)') as issuingAgencyText ,DataNode.value(N'(dcjis_ext:DataElement[@dcjis_ext:elementName="issuingOfficerFirstName"][1])', 'nvarchar(50)') as issuingOfficerFirstName ,DataNode.value(N'(dcjis_ext:DataElement[@dcjis_ext:elementName="issuingOfficerMiddleName"][1])', 'nvarchar(50)') as issuingOfficerMiddleName ,DataNode.value(N'(dcjis_ext:DataElement[@dcjis_ext:elementName="issuingOfficerLastName"][1])', 'nvarchar(50)') as issuingOfficerLastName ,DataNode.value(N'(dcjis_ext:DataElement[@dcjis_ext:elementName="issuingOfficerIdNo"][1])', 'nvarchar(10)') as issuingOfficerIdNo ,DataNode.value(N'(dcjis_ext:DataElement[@dcjis_ext:elementName="activityCode"][1])', 'nvarchar(2)') as activityCode ,DataNode.value(N'(dcjis_ext:DataElement[@dcjis_ext:elementName="activityText"][1])', 'nvarchar(20)') as activityText ,DataNode.value(N'(dcjis_ext:DataElement[@dcjis_ext:elementName="verbalWarningInd"][1])', 'nvarchar(10)') as verbalWarningInd FROM #test t CROSS APPLY t.xml_data.nodes('/dcjis:DataExchange/dcjis_ext:DataElements') AS V(DataNode) WHERE xml_data is not null;
- 0105Copper Contributor
Great! Thanks so much.
I'm still having troubles with another bit of XML. I can't seem to get my CROSS APPLYs to work with the
id within the tag). The XML and my SQL code are below.
<dcjis:DataExchange xmlns:dcjis="http://www.xfact.com/schemas/eopss/dcjis/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dcjis-ext="http://www.xfact.com/schemas/eopss/dot-ec/1.0/extension" xmlns:dot-ec="http://www.xfact.com/schemas/eopss/dot-ec/1.0/extension" xmlns:nc="http://niem.gov/niem/niem-core/2.0" xmlns:j="http://niem.gov/niem/domains/jxdm/4.0" xmlns:s="http://niem.gov/niem/structures/2.0">
<dot-ec:Person s:id="person1">
<nc:PersonName>
<nc:PersonGivenName>MATHIAS</nc:PersonGivenName>
<nc:PersonMiddleName>F</nc:PersonMiddleName>
<nc:PersonSurName>WEMBLEY</nc:PersonSurName>
</nc:PersonName>
</dot-ec:Person>
</dcjis:DataExchange>SQL:
WITH XMLNAMESPACES( 'http://www.xfact.com/schemas/eopss/dcjis/1.0' AS dcjis
, 'http://www.xfact.com/schemas/eopss/dot-ec/1.0/extension' AS dot_ec
, 'http://niem.gov/niem/niem-core/2.0' AS nc
, 'http://niem.gov/niem/domains/jxdm/4.0' AS j
, 'http://niem.gov/niem/structures/2.0' AS s)
SELECT [z_06].[MSPPSDataId]
, oNode.value(N'(nc:PersonGivenName)[1]', 'NVARCHAR(50)')
AS OfficerFirstName
, oNode.value(N'(nc:PersonMiddleName)[1]', 'NVARCHAR(50)')
AS OfficerMiddleName
, LEFT(oNode.value(N'(nc:PersonMiddleName)[1]', 1), 'NCHAR(1)')
AS OfficerMI
, oNode.value(N'(nc:PersonSurnameName)[1]', 'NVARCHAR(50)')
AS OfficerLastName
INTO [dbo].[z_06_Officer_Data]
FROM [dbo].[z_06_Officer_XML] AS [z_06]
CROSS APPLY [z_06].[Officer].nodes('/dcjis:DataExchange/dot-ec:Person') AS o(oNode)
CROSS APPLY oNode.nodes('nc:PersonName') AS p(pNode);
- rodgerkongIron Contributor
What is the result you want?
- 0105Copper Contributor
A table containing all of the data points in the XML.
- rodgerkongIron Contributor
Is this what you want?
Replace the table name (#test) to your table that contain xml column, and replace column name(xml_data) to your xml column name, then you can try to run the script.WITH XMLNAMESPACES( 'http://www.xfact.com/schemas/eopss/dcjis/1.0' AS dcjis ,'http://www.xfact.com/schemas/eopss/dot-ec/1.0/extension' AS dot_ec ,'http://niem.gov/niem/niem-core/2.0' AS nc ,'http://niem.gov/niem/domains/jxdm/4.0' AS j ,'http://niem.gov/niem/structures/2.0' AS s) SELECT t.id, --assume your table has a key named id. You can replace it with your key column or just comment this line VehicleNode.value(N'(@s:id)', 'nvarchar(20)') as V_ID ,VehicleNode.value(N'(nc:VehicleColorPrimaryCode)[1]', 'nvarchar(20)') as ColorPrimaryCode ,VehicleNode.value(N'(nc:ItemMakeName)[1]', 'nvarchar(20)') as MakeName ,VehicleNode.value(N'(nc:ItemModelName)[1]', 'nvarchar(20)') as ModelName ,VehicleNode.value(N'(nc:ItemModelYearDate)[1]', 'nvarchar(4)') as ModelYear ,VehicleNode.value(N'(nc:VehicleCMVIndicator)[1]', 'nvarchar(10)') as CMVIndicator ,RegNode.value(N'(nc:ConveyanceRegistrationPlateIdentification/nc:IdentificationID)[1]','nvarchar(20)') as ConveyanceRegistrationPlateIdentification ,RegNode.value(N'(nc:ConveyanceRegistrationPlateIdentification/nc:IdentificationExpirationDate/nc:Date)[1]','date') as ConveyanceRegistrationExpirationDate ,RegNode.value(N'(nc:ConveyanceRegistrationPlateIdentification/j:DrivingJurisdictionAuthorityANSID20Code)[1]','nvarchar(10)') as DrivingJurisdictionAuthorityANSID20Code ,RegNode.value(N'(nc:ConveyanceRegistrationPlateIdentification/nc:IdentificationJurisdictionFIPS10-4Code)[1]','nvarchar(10)') as IdentificationJurisdictionFIPS10_4Code ,RegNode.value(N'(dot_ec:VehiclePlateTypeCode)[1]','nvarchar(10)') as VehiclePlateTypeCode ,RegNode.value(N'(dot_ec:VehiclePlateTypeText)[1]','nvarchar(10)') as VehiclePlateTypeText ,VehicleNode.value(N'(dot_ec:VehiclePassenger16PlusIndicator)[1]' ,'nvarchar(10)') as VehiclePassenger16PlusIndicator ,VehicleNode.value(N'(dot_ec:HazMatPlacardDisplayedIndicator)[1]', 'nvarchar(10)') as HazMatPlacardDisplayedIndicator ,VehicleNode.value(N'(dot_ec:VehicleRegistrationUnknownIndicator)[1]', 'nvarchar(10)') as VehicleRegistrationUnknownIndicator ,VehicleNode.value(N'(nc:InsuranceCarrierName)[1]', 'nvarchar(20)') as InsuranceCarrierName FROM #test t --Replace "#test" with your table name CROSS APPLY t.xml_data.nodes('/dcjis:DataExchange/dot_ec:Vehicle') AS V(VehicleNode) --Replace "xml_data" with your xml column name CROSS APPLY VehicleNode.nodes('nc:ConveyanceRegistration') AS R(RegNode) WHERE xml_data is not null; --Replace "xml_data" with your xml column name