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

Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64) Apr 2 2010 15:48:46 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.0 <X64> (Build 6002: Service Pack 2)

Вопрос - есть такой xml, как из него извлечь данные
DECLARE @xml NVARCHAR(MAX)=N'<?xml version="1.0" encoding="utf-16"?><Names>
<Name>Nm1</Name>
<Name>Nm2</Name>
</Names>',
@idoc INT

EXEC sp_xml_preparedocument @idoc OUTPUT, @xml
SELECT TOP 100 Name
FROM OPENXML (@idoc, 'Names',2)
WITH (Name nvarchar(max))

Возвращает только Nm1, а как достать остальные?
30 мар 11, 13:29    [10445110]     Ответить | Цитировать Сообщить модератору
 Re: xml, как извлечь данные  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
DECLARE @xml xml='<Names><Name>Nm1</Name><Name>Nm2</Name></Names>'

select @xml.value('(/Names/Name)[1]', 'varchar(50)' ) Name1
     , @xml.value('(/Names/Name)[2]', 'varchar(50)' ) Name2
30 мар 11, 13:41    [10445211]     Ответить | Цитировать Сообщить модератору
 Re: xml, как извлечь данные  [new]
1
Guest
А если у меня будет
N'<?xml version="1.0" encoding="utf-16"?><Names>
<Name>Nm1</Name>
<Name>Nm2</Name>
......
......
<Name>Nm10000</Name>
</Names>'
тогда как извлечь данные, одним запросом?
30 мар 11, 16:07    [10446688]     Ответить | Цитировать Сообщить модератору
 Re: xml, как извлечь данные  [new]
iljy
Member

Откуда:
Сообщений: 8711
1,
declare @x xml =N'<?xml version="1.0" encoding="utf-16"?><Names>
<Name>Nm1</Name>
<Name>Nm2</Name>
<Name>Nm10000</Name>
</Names>'
select n.value('.','varchar(50)') Name
from @x.nodes('/Names/*') t(n)
30 мар 11, 16:14    [10446789]     Ответить | Цитировать Сообщить модератору
 Re: xml, как извлечь данные  [new]
1
Guest
Все получилось. Всем большое спасибо.
30 мар 11, 16:43    [10447133]     Ответить | Цитировать Сообщить модератору
 Re: xml, как извлечь данные  [new]
Glory
Member

Откуда:
Сообщений: 104760
SELECT TOP 100 *
FROM OPENXML (@idoc, 'Names/Name',1)
WITH (Name nvarchar(max) 'text()')
30 мар 11, 16:49    [10447196]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: xml, как извлечь данные  [new]
Evelion
Member

Откуда:
Сообщений: 37
Glory, подскажите пожалуйста, где и в чем я ошибся ?

Пробовал сделать аналогичную вещь двумя разными способами:

Для начала - присваиваю переменной код XML.

DECLARE @x XML,
@idoc int

set @x = '<ShowPlanXML xmlns="http://schemas.microsoft.com/sqlserver/2004/07/showplan" Version="1.1" Build="10.50.1600.1">
<BatchSequence>
<Batch>
<Statements>
<StmtSimple>
<QueryPlan DegreeOfParallelism="1" CachedPlanSize="16" CompileTime="0" CompileCPU="0" CompileMemory="88">
<RelOp NodeId="0" PhysicalOp="Clustered Index Scan" LogicalOp="Clustered Index Scan" EstimateRows="8" EstimateIO="0.003125" EstimateCPU="0.0001658" AvgRowSize="442" EstimatedTotalSubtreeCost="0.0032908" TableCardinality="8" Parallel="0" EstimateRebinds="0" EstimateRewinds="0">
<OutputList>
<ColumnReference Database="[tempdb]" Schema="[dbo]" Table="[XML]" Column="RowNumber" />

.......... ПРОПУЩЕНО ДЛЯ ЭКОНОМИИ МЕСТА.............

<ColumnReference Database="[tempdb]" Schema="[dbo]" Table="[XML]" Column="BinaryData" />
</OutputList>
<RunTimeInformation>
<RunTimeCountersPerThread Thread="0" ActualRows="12" ActualEndOfScans="1" ActualExecutions="1" />
</RunTimeInformation>
<IndexScan Ordered="0" ForcedIndex="0" NoExpandHint="0">
<DefinedValues>
<DefinedValue>
<ColumnReference Database="[tempdb]" Schema="[dbo]" Table="[XML]" Column="RowNumber" />

.......... ПРОПУЩЕНО ДЛЯ ЭКОНОМИИ МЕСТА.............

</DefinedValue>
</DefinedValues>
<Object Database="[tempdb]" Schema="[dbo]" Table="[XML]" Index="[PK__XML__AAAC09D84AD81681]" IndexKind="Clustered" />
</IndexScan>
</RelOp>
</QueryPlan>
</StmtSimple>
</Statements>
</Batch>
</BatchSequence>
</ShowPlanXML>'

Вариант 1:
select @x.value('(ShowPlanXML/BatchSequence/Batch/Statements/StmtSimple/QueryPlan/RelOp/@EstimateRows)[1]','int') rows

Результат - NULL

Вариант 2:
EXEC sp_xml_preparedocument @idoc OUTPUT, @x
SELECT TOP 100 StatementEstRows
FROM OPENXML (@idoc, 'ShowPlanXML/BatchSequence/Batch/Statements/StmtSimple/QueryPlan/RelOp',1)
WITH (StatementEstRows int '@EstimateRows')

Результат - пустота

В качестве кода предполагается использование XML плана выполнения, который будет присваиваться переменной автоматически.
25 июл 12, 16:36    [12915019]     Ответить | Цитировать Сообщить модератору
 Re: xml, как извлечь данные  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

;with xmlnamespaces(default 'http://schemas.microsoft.com/sqlserver/2004/07/showplan')
  select @x.value('(ShowPlanXML/BatchSequence/Batch/Statements/StmtSimple/QueryPlan/RelOp/@EstimateRows)[1]','int') rows


Posted via ActualForum NNTP Server 1.5

25 июл 12, 16:41    [12915071]     Ответить | Цитировать Сообщить модератору
 Re: xml, как извлечь данные  [new]
Evelion
Member

Откуда:
Сообщений: 37
daw, Большое спасибо !

Все работает, но не могли бы вы подсказать, чего не хватает во втором варианте ?
25 июл 12, 17:10    [12915278]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить