2013-11-23 2 views
0

У меня есть одна таблица SQL с XML-столбец, который содержит значение, как следующий формат XMLSQL в XQuery с цикл

<Security xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <Dacl> 
    <ACEInformation> 
     <UserName>Authenticated Users</UserName> 
     <Access>Allow</Access> 
     <IsInherited>false</IsInherited> 
     <ApplyTo>This object only</ApplyTo> 
     <Permission>List Contents</Permission> 
     <Permission>Read All Properties</Permission> 
     <Permission>Read Permissions</Permission> 
    </ACEInformation> 
    <ACEInformation> 
     <UserName>Local System</UserName> 
     <Access>Allow</Access> 
     <IsInherited>false</IsInherited> 
     <ApplyTo>This object only</ApplyTo> 
     <Permission>Read All Properties</Permission> 
     <Permission>Read Permissions</Permission> 
    </ACEInformation> 
    </Dacl> 
</Security> 

Здесь я хотел бы получить выход из колонки XML, как это

[Разрешить -> Аутентифицированные пользователи -> Содержание списка; Читать все свойства; Разрешения на чтение; -> Этот объект только]

Для достижения этой цели я использую следующие для запроса цикла присоединиться значения

SELECT xmlColumn.query('for $item in/Security/Dacl/ACEInformation return("[",data($item/Access) 
[1],"->",data($item/UserName)[1],"->", (for $item2 in $item/Permission return concat($item2,";")),"- 
>",data($item/ApplyTo)[1],"]")').value('.','NVARCHAR(MAX)')+' ; ' From myTable 

Запрос работает нормально, но это занимает слишком много времени, чтобы дать результат, за 1000 строки, это займет 2 минуты ... может ли кто-нибудь помочь мне улучшить производительность этого запроса ?.

ответ

0

попробовать что-то вроде этого:

DECLARE @table TABLE (ID INT, XmlCOntent XML) 

INSERT INTO @Table VALUES(1, '<Security xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <Dacl> 
    <ACEInformation> 
     <UserName>Authenticated Users</UserName> 
     <Access>Allow</Access> 
     <IsInherited>false</IsInherited> 
     <ApplyTo>This object only</ApplyTo> 
     <Permission>List Contents</Permission> 
     <Permission>Read All Properties</Permission> 
     <Permission>Read Permissions</Permission> 
    </ACEInformation> 
    <ACEInformation> 
     <UserName>Local System</UserName> 
     <Access>Allow</Access> 
     <IsInherited>false</IsInherited> 
     <ApplyTo>This object only</ApplyTo> 
     <Permission>Read All Properties</Permission> 
     <Permission>Read Permissions</Permission> 
    </ACEInformation> 
    </Dacl> 
</Security>') 

SELECT 
    ID, 
    Access = XACE.value('(Access)[1]', 'varchar(50)'), 
    ApplyTo = XACE.value('(ApplyTo)[1]', 'varchar(50)'), 
    AuthUser = XACE.value('(UserName)[1]', 'varchar(50)'), 
    Perm1 = XACE.value('(Permission)[1]', 'varchar(50)'), 
    Perm2 = XACE.value('(Permission)[2]', 'varchar(50)'), 
    Perm3 = XACE.value('(Permission)[3]', 'varchar(50)') 
FROM 
    @table 
CROSS APPLY 
    XmlContent.nodes('/Security/Dacl/ACEInformation') AS XTbl(XACE) 

дает мне выход:

enter image description here

+0

Спасибо за ваш ответ, но моя потребность, я должен объединить все значения и получить как один столбец – kombsh

1
select (
     select '['+ 
       A.X.value('(Access/text())[1]', 'nvarchar(max)')+ 
       '->'+ 
       A.X.value('(UserName/text())[1]', 'nvarchar(max)')+ 
       '->'+ 
       (
       select P.X.value('(./text())[1]', 'nvarchar(max)')+';' 
       from A.X.nodes('Permission') as P(X) 
       for xml path(''), type 
       ).value('text()[1]', 'nvarchar(max)')+ 
       '->'+ 
       A.X.value('(ApplyTo/text())[1]', 'nvarchar(max)')+ 
       ']' 
     from T.xmlColumn.nodes('/Security/Dacl/ACEInformation') as A(X) 
     for xml path(''), type 
     ).value('text()[1]', 'nvarchar(max)') 
from myTable as T 
+0

Хорошая работа ... большое спасибо вам .... это сократило мое время запроса с 2,5 минут до 10 секунд – kombsh

+0

@kombsh Если вы находитесь на SQL Server 2012, вы можете вероятно, ускорить это с помощью [выборочных индексов XML] (http://technet.microsoft.com/en-us/library/jj670108.aspx). –

+0

ОК. спасибо за ваш совет Mikael – kombsh

 Смежные вопросы

  • Нет связанных вопросов^_^