Извличане на стойности от XML поле в MS-SQL Server 2008

Опитвам се да извлека четири части от информация от база данни на MS-SQL Server 2008, която се съхранява в едно XML поле. Това е първият път, когато трябва да работя с XML, така че имам малко проблеми и затова имам само данните, които се опитвам да извлека. Опитах се да използвам други публикации, за да разреша проблема си, но очевидно без успех.

Четирите части от информация са първо „Мениджър на проекта“ и след това „Стойност“, а след това 2-ро е „Център за печалба“ и след това тази стойност. Стойността от "Центъра за печалба" ще се използва за свързване между две таблици. По-долу е извадка от XML данните, които се съхраняват в това поле.

    <ArrayOfEntityPropertyOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
     xmlns:xsd="http://www.w3.org/2001/XMLSchema">
     <EntityPropertyOfString>
       <Name>Project Manager</Name>
       <Value>DBD</Value>
     </EntityPropertyOfString>
     <EntityPropertyOfString>
       <Name>Profit Center</Name>
       <Value>211</Value>
     </EntityPropertyOfString>
    </ArrayOfEntityPropertyOfString>

Така че в този пример трябва да използвам стойността на „Център за печалба“ „211“, за да съединя двете таблици в MS-SQL заявка. Таблицата, в която тази информация може да се нарече „tblProfitCenter“, а полето, което я съдържа, „prftData“.

Ето измислена заявка, която би свършила същата работа, ако данните в "prftData" не бяха в XML, а вместо това бяха редовно цяло числово поле, което съдържа идентификатора на центъра за печалба и извършва свързването.

    SELECT md.LName, md.FName, pc.ProfitCenterName
    FROM tblMainDataCenter md
    LEFT OUTER JOIN tblProfitCenter pc ON md.pcID = pc.prftData

Това е за проект, в който работя, и трябва да мога да надхвърля това. Обикновено бих научил XML, за да разреша това, но времето няма да позволи това. Докато не получа шанс да науча XML, ще се радвам на всяка помощ.


person Nosharu    schedule 26.07.2013    source източник


Отговори (2)


Можете да използвате valuefunction в XML колона, за да извлечете данни от XML по следния начин:

SELECT col.value('(/ArrayOfEntityPropertyOfString/EntityPropertyOfString[Name="Profit Center"]/Value)[1]', 'int')
FROM tbl

ако приемем, че вашата таблица е с име tbl, а XML колоната е с име col.

Първият аргумент е XPath 1 израз, а вторият целевият тип данни. Моля, имайте предвид, че тези низове трябва да бъдат коригиращи низове в SQL Server и не могат да се създават динамично, напр. ж. чрез конкатенация на низове.

person FrankPl    schedule 26.07.2013

Следната заявка ще ви позволи да вземете xml съдържанието и да го поставите във формат на таблица, така че след това да можете да извършите необходимите sql операции върху тази таблица:

Declare @xmlstring xml = '<ArrayOfEntityPropertyOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
     xmlns:xsd="http://www.w3.org/2001/XMLSchema">
     <EntityPropertyOfString>
       <Name>Project Manager</Name>
       <Value>DBD</Value>
     </EntityPropertyOfString>
     <EntityPropertyOfString>
       <Name>Profit Center</Name>
       <Value>211</Value>
     </EntityPropertyOfString>
    </ArrayOfEntityPropertyOfString>'


select MainDataCenter.Col.value('(Name)[1]','varchar(max)') as Name
,MainDataCenter.Col.value('(Value)[1]','varchar(max)') as Value
from @xmlstring.nodes('/ArrayOfEntityPropertyOfString/EntityPropertyOfString') as MainDataCenter(Col)
person Petio Ivanov    schedule 26.07.2013