Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите прописать доступ к узлам ХML  [new]
Stilet
Member

Откуда: УФА, БАШКОРТОСТАН
Сообщений: 411
declare @strxml xml

SELECT @strxml=CONVERT(xml, BulkColumn, 2) FROM
OPENROWSET(Bulk N'C:\sss1.xml', SINGLE_BLOB) [rowsetresults]
select @strxml
declare @XmlHandle int

EXEC sp_xml_preparedocument @XmlHandle output,@strxml


--Выдает хоть какой то результат
SELECT *
FROM OPENXML (@XmlHandle, '/Events',1)

--Выдает NULL хотелось получить значения узлов
SELECT *
FROM OPENXML (@XmlHandle, '/Events/Event/',1)
WITH (xmlns varchar(256) '@xmlns')


EXEC sp_xml_removedocument @XmlHandle

К сообщению приложен файл (sss1.xml - 1Kb) cкачать
19 июн 12, 12:47    [12737465]     Ответить | Цитировать Сообщить модератору
 Re: Помогите прописать доступ к узлам ХML  [new]
andrey odegov
Member

Откуда:
Сообщений: 473
Stilet, хотелось бы увидеть
select @@version
19 июн 12, 13:02    [12737628]     Ответить | Цитировать Сообщить модератору
 Re: Помогите прописать доступ к узлам ХML  [new]
andrey odegov
Member

Откуда:
Сообщений: 473
но судя по способу применения openrowset попробуйте так
+
select
 ns.x.value(N'declare namespace e="http://schemas.microsoft.com/win/2004/08/events/event";
              (e:System/e:Provider)[1]/@Guid',N'nvarchar(38)')
,ns.x.value(N'declare namespace e="http://schemas.microsoft.com/win/2004/08/events/event";
              (e:System/e:EventID)[1]',N'int')
,ns.x.value(N'declare namespace e="http://schemas.microsoft.com/win/2004/08/events/event";
              string(e:EventData[1])',N'nvarchar(max)')
,ns.x.value(N'declare namespace e="http://schemas.microsoft.com/win/2004/08/events/event";
              (e:EventData/e:Data)[@Name="PrivilegeList"][1]',N'nvarchar(max)')
,ns.x.value(N'declare namespace e="http://schemas.microsoft.com/win/2004/08/events/event";
              (e:EventData/e:Data)[last()]',N'nvarchar(260)')
from (select cast(b.b as xml)
      from openrowset(bulk N'C:\Downloads\sss1.xml',single_blob) as b(b)) as x(x)
cross apply x.x.nodes(N'declare namespace e="http://schemas.microsoft.com/win/2004/08/events/event";
                        /Events/e:Event') as ns(x);
with xmlnamespaces(N'http://schemas.microsoft.com/win/2004/08/events/event' as e)
select
 ns.x.value(N'(e:System/e:Provider)[1]/@Guid',N'nvarchar(38)')
,ns.x.value(N'(e:System/e:EventID)[1]',N'int')
,ns.x.value(N'string(e:EventData[1])',N'nvarchar(max)')
,ns.x.value(N'(e:EventData/e:Data)[@Name="PrivilegeList"][1]',N'nvarchar(max)')
,ns.x.value(N'(e:EventData/e:Data)[last()]',N'nvarchar(260)')
from (select cast(b.b as xml)
      from openrowset(bulk N'C:\Downloads\sss1.xml',single_blob) as b(b)) as x(x)
cross apply x.x.nodes(N'/Events/e:Event') as ns(x);
19 июн 12, 14:50    [12738874]     Ответить | Цитировать Сообщить модератору
 Re: Помогите прописать доступ к узлам ХML  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Если у вас XML файл, то не воспользоваться XmlBulkLoad - идиотизм, особенно если файлы "тяжёлые", и ещё более, если XML в несколько таблиц надо загнать.
EXEC dbo.spXmlBulkLoad 'sss1.xml', 'sss1.xsd', 'MyDataBase'
19 июн 12, 15:20    [12739233]     Ответить | Цитировать Сообщить модератору
 Re: Помогите прописать доступ к узлам ХML  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
andrey odegov
'declare namespace e="http://schemas.microsoft.com/win/2004/08/events/event"'
'declare namespace e="http://schemas.microsoft.com/win/2004/08/events/event"'
'declare namespace e="http://schemas.microsoft.com/win/2004/08/events/event"'
'declare namespace e="http://schemas.microsoft.com/win/2004/08/events/event"'
FacePalm.JPG

WITH XMLNAMESPACES ('e="http://schemas.microsoft.com/win/2004/08/events/event"') ...
19 июн 12, 15:24    [12739279]     Ответить | Цитировать Сообщить модератору
 Re: Помогите прописать доступ к узлам ХML  [new]
andrey odegov
Member

Откуда:
Сообщений: 473
Mnior, мой 2-й вариант под спойлером чем не подходит и как быть если ТС захочет завернуть что-то из этого в CTE?
19 июн 12, 15:29    [12739348]     Ответить | Цитировать Сообщить модератору
 Re: Помогите прописать доступ к узлам ХML  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
andrey odegov, ссори, но непонятно зачем писать вариант с declare.

XML Schema Generator
+ XSD
<?xml version="1.0" encoding="utf-16"?>
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="Events">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="Event">
          <xsd:complexType>
            <xsd:sequence>
              <xsd:element name="System">
                <xsd:complexType>
                  <xsd:sequence>
                    <xsd:element name="Provider">
                      <xsd:complexType>
                        <xsd:attribute name="Name" type="xsd:string" />
                        <xsd:attribute name="Guid" type="xsd:string" />
                      </xsd:complexType>
                    </xsd:element>
                    <xsd:element name="EventID" type="xsd:int" />
                    <xsd:element name="Version" type="xsd:int" />
                    <xsd:element name="Level" type="xsd:int" />
                    <xsd:element name="Task" type="xsd:int" />
                    <xsd:element name="Opcode" type="xsd:int" />
                    <xsd:element name="Keywords" type="xsd:string" />
                    <xsd:element name="TimeCreated">
                      <xsd:complexType>
                        <xsd:attribute name="SystemTime" type="xsd:dateTime" />
                      </xsd:complexType>
                    </xsd:element>
                    <xsd:element name="EventRecordID" type="xsd:int" />
                    <xsd:element name="Correlation" type="xsd:string" />
                    <xsd:element name="Execution">
                      <xsd:complexType>
                        <xsd:attribute name="ProcessID" type="xsd:int" />
                        <xsd:attribute name="ThreadID" type="xsd:int" />
                      </xsd:complexType>
                    </xsd:element>
                    <xsd:element name="Channel" type="xsd:string" />
                    <xsd:element name="Computer" type="xsd:string" />
                    <xsd:element name="Security" type="xsd:string" />
                  </xsd:sequence>
                </xsd:complexType>
              </xsd:element>
              <xsd:element name="EventData">
                <xsd:complexType>
                  <xsd:sequence>
                    <xsd:element name="Data">
                      <xsd:complexType>
                        <xsd:attribute name="Name" type="xsd:string" />
                      </xsd:complexType>
                    </xsd:element>
                  </xsd:sequence>
                </xsd:complexType>
              </xsd:element>
            </xsd:sequence>
          </xsd:complexType>
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

Если EventaData нужно как расширение основной таблы, а не в отдельную таблу, то либо не выйдет сразу (после загрузки PIVOT-ом зафигачить), или попытаться поменять XSD.

Если у вас файл как пример, и будет передоваться с клиента, то лучше на клиенте в таблицу перегнать, а далее табличным параметром передовать. XML на скуле парсить - моветон.

PS: Конечно надо у XSD заметки дописать (в какую таблу загонять и т.п.).
19 июн 12, 15:34    [12739400]     Ответить | Цитировать Сообщить модератору
 Re: Помогите прописать доступ к узлам ХML  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
andrey odegov
как быть если ТС захочет завернуть что-то из этого в CTE?
XMLNAMESPACES и CTE cовместимы. А вот в Exists да, не напишешь.
19 июн 12, 15:36    [12739429]     Ответить | Цитировать Сообщить модератору
 Re: Помогите прописать доступ к узлам ХML  [new]
andrey odegov
Member

Откуда:
Сообщений: 473
Это неправильно
Mnior
WITH XMLNAMESPACES ('e="http://schemas.microsoft.com/win/2004/08/events/event"') ...
Правильно так
with xmlnamespaces(N'http://schemas.microsoft.com/win/2004/08/events/event' as e)...
19 июн 12, 15:38    [12739454]     Ответить | Цитировать Сообщить модератору
 Re: Помогите прописать доступ к узлам ХML  [new]
andrey odegov
Member

Откуда:
Сообщений: 473
Mnior
andrey odegov
как быть если ТС захочет завернуть что-то из этого в CTE?
XMLNAMESPACES и CTE cовместимы. А вот в Exists да, не напишешь.
Пример покажете?
19 июн 12, 15:40    [12739485]     Ответить | Цитировать Сообщить модератору
 Re: Помогите прописать доступ к узлам ХML  [new]
andrey odegov
Member

Откуда:
Сообщений: 473
блин, вот оно как
with xmlnamespaces(N'http://schemas.microsoft.com/win/2004/08/events/event' as e)
,x as (
select cast(b.b as xml) as x
from openrowset(bulk N'C:\Downloads\sss1.xml',single_blob) as b(b))
select
 ns.x.value(N'(e:System/e:Provider)[1]/@Guid',N'nvarchar(38)')
,ns.x.value(N'(e:System/e:EventID)[1]',N'int')
,ns.x.value(N'string(e:EventData[1])',N'nvarchar(max)')
,ns.x.value(N'(e:EventData/e:Data)[@Name="PrivilegeList"][1]',N'nvarchar(max)')
,ns.x.value(N'(e:EventData/e:Data)[last()]',N'nvarchar(260)')
from x cross apply x.x.nodes(N'/Events/e:Event') as ns(x);
19 июн 12, 15:54    [12739655]     Ответить | Цитировать Сообщить модератору
 Re: Помогите прописать доступ к узлам ХML  [new]
Stilet
Member

Откуда: УФА, БАШКОРТОСТАН
Сообщений: 411
Ну что тут мужики скажешь то ? Разве что только Большое человеческое спасибо Вам )))
20 июн 12, 06:44    [12742784]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить