I have a relation which has an XML column storing data in the following structure
<Report id="b5d9b8da-7af4-4257-b825-b28af91dd833">
<CreatedDate>04-12-2012</CreatedDate>
<LastUpdated>04-12-2012</LastUpdated>
<Reference>abc123</Reference>
</Report>
I’m writing a stored procedure to retrieve all reports and join them and wrap them in a root node called reports. I have the following so far;
WITH XMLNAMESPACES(DEFAULT 'http://www.defaultnamespace.com/1.0')
SELECT
@Xml =
(
SELECT
(
SELECT xml.query('.')
FROM
[database].[Reports]
WHERE
ClientId = @clientId
FOR XML PATH(''),
TYPE
)
FOR XML PATH('Reports'),
TYPE
)
Whilst this returns all the reports in the right format, there exists a blank default namespace on the report element like the following;
<Reports xmlns="http://www.defaultnamespace.com/1.0">
<Report xmlns="" id="b5d9b8da-7af4-4257-b825-b28af91dd833">
<CreatedDate>04-12-2012</CreatedDate>
<LastUpdated>04-12-2012</LastUpdated>
<Reference>abc123</Reference>
</Report>
</Reports>
Could someone explain a suitable way of excluding the namespace on the report element?
Any help is greatly appreciated guys 🙂
Advertisement
Answer
Your issue is that the column was not stored with a default namespace of “http://www.defaultnamespace.com/1.0”.
So the logical name of your tag is NS = “”, name =Report.
SQL Server is being absolutely correct.
What you would like to do is to say
by the way, that XML data I stored, I want you to rewrite every tag from the “” namespace logically attached to every name, to a tag of the same relative name in the “http://www.defaultnamespace.com/1.0” namespace, and then make that the default namespace
AFAIK, You can’t do that (but if you find a way let me know!). The closest you can get is cast it to nvarchar(max)
with no namespace, then cast it back again with the desired namespace applied.