الحصول على أسماء الصفات من عنصر في عمود XML SQL
-
04-07-2019 - |
سؤال
لهذا xml (في SQL 2005 XML عمود):
<doc>
<a>1</a>
<b ba="1" bb="2" bc="3" />
<c bd="3"/>
<doc>
أود أن تكون قادرة على استرجاع الأسماء من الصفات (ba, bb, bc, bd) بدلا من القيم داخل SQL Server 2005.حسنا, XPath بالتأكيد يسمح هذا مع اسم() ولكن SQL server لا يدعم هذا.هذا هو رئيس الشكوى مع استخدام XML في SQL;لديك لمعرفة أي أجزاء من XML/Xpath/XQuery المواصفات هناك.
الطريقة الوحيدة التي أستطيع أن أفكر في القيام بذلك هو بناء CLR proc أن الأحمال XML إلى مستند XML (iirc) ويعمل XPath لاستخراج أسماء العقد.أنا منفتح على الاقتراحات هنا.
المحلول
DECLARE @xml as xml
DECLARE @path as varchar(max)
DECLARE @index int, @count int
SET @xml =
'<doc>
<a>1</a>
<b ba="1" bb="2" bc="3" />
<c bd="3"/>
</doc>'
SELECT @index = 1
SET @count = @xml.query('count(/doc/b/@*)').value('.','int')
WHILE @index <= @count
BEGIN
SELECT @xml.value('local-name((/doc/b/@*[sql:variable("@index")])[1])', 'varchar(max)')
SET @index = @index + 1
END
عن العنصر "ب"
فإنه يعود
- با
- bb
- قبل الميلاد
يمكنك بناء حلقة للحصول على سمات كل عنصر في xml.
راجع للشغل XML في العينة الخاصة بك يجب أن تكون مغلقة في الختام دكتور الوسم.
نصائح أخرى
DECLARE @xml as xml
SET @xml =
'<doc>
<a>1</a>
<b ba="1" bb="2" bc="3" />
<c bd="3"/>
</doc>'
SELECT DISTINCT
CAST(Attribute.Name.query('local-name(.)') AS VARCHAR(100)) Attribute,
Attribute.Name.value('.','VARCHAR(100)') Value
FROM @xml.nodes('//@*') Attribute(Name)
وإرجاع:
وقيمة السمة
وبا 1
وب 2
وق 3
ودينار بحريني 3
وهذا:
declare @xml as xml
set @xml =
'<doc>
<a>1</a>
<b ba="1" bb="2" bc="3" />
<c bd="3"/>
</doc>'
select @xml.query('
for $attr in /doc/b/@*
return local-name($attr)')
والعوائد:
وبا ب ب ق
Declare @xml Xml = '<doc><a>1</a><b ba="1" bb="2" bc="3" /><c bd="3"/></doc>'
Select n.value('local-name(.)', 'varchar(max)') from @xml.nodes('/doc/*/@*') a(n)
وعودة با ب قبل الميلاد دينار بحريني