XML DML-запрос для атрибута
declare @myDoc xml
set @myDoc = '<Form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.mydomain.org/MySchema.xsd" SectionId="ABCD" Description="Some stuff">
<ProductDescription ProductID="1" ProductName="Road Bike">
<Features>
<Warranty>1 year parts and labor</Warranty>
<Maintenance>3 year parts and labor extended maintenance is available</Maintenance>
</Features>
</ProductDescription>
</Form>'
;WITH XMLNAMESPACES( 'http://www.w3.org/2001/XMLSchema-instance' as xsi, 'http://www.w3.org/2001/XMLSchema' as xsd, DEFAULT 'http://www.mydomain.org/MySchema.xsd' )
SELECT @myDoc.value('/Form[@SectionId][0]', 'varchar')
Мне нужно получить значение атрибута SectionId в качестве nvarchar? как мне это сделать?...
T и R Марк
2 ответа
Решение
Вы могли бы написать это еще проще:
;WITH XMLNAMESPACES(DEFAULT 'http://www.mydomain.org/MySchema.xsd')
SELECT @myDoc.value('(/Form/@SectionId)[1]', 'VARCHAR(100)') AS SectionId
Поскольку вы никогда не используете / ссылаетесь на какие-либо из xsi
или же xsd
пространства имен, нет необходимости объявлять их.
И поскольку вы выбираете только один атрибут из одного элемента, нет смысла использовать .nodes()
функция для создания внутренней "фиктивной таблицы".
;WITH XMLNAMESPACES( 'http://www.w3.org/2001/XMLSchema-instance' as xsi, 'http://www.w3.org/2001/XMLSchema' as xsd, DEFAULT 'http://www.mydomain.org/MySchema.xsd' )
SELECT Node.value('@SectionId', 'VARCHAR(100)') AS SectionId
FROM @myDoc.nodes('/Form') TempXML (Node);