JOIN XML and SQL ?

Snark
Дата: 15.10.2003 03:04:00
Есть XML документ храняший список имен авторов и соответствюшие уникальные идентификаторы (ID)
структура документа :

<Authors>
<Author>
<ID>1</ID>
<Name>A</Name>
</Author>
<Author>
<ID>2</ID>
<Name>B</Name>
</Author>
<Author>
<ID>3</ID>
<Name>C</Name>
</Author>
</Authors>

XML документ со списоком авторов постоянен и не меняется
Есть список ID авторов возврашаемых хранимой процедурой.
Например : 1,3.
Требуется : выбрать из XML документа только тех авторов (ID и Name) где ID равен одному из тех что вернула хранимая процедура.
То есть "в переводе на SQL"

Select XMLDOCUMENT.* FROM XMLDOCUMENT INNER JOIN MyResultDataSet ON XMLDOCUMENT.ID
= MyResultDataSet.ID

результат должен быть такой

ID Name
---- -----------

1 A
3 C

Можно ли и, каким способом, это сделать ?
Snark
Дата: 15.10.2003 03:17:25
собственно цель задачи - оптимизировать работу клиентского приложения.
В зависимости от запроса пользователя, необходимо выводить список только тех авторов которые соотвествуют поисковым критериям. Пересылать каждый раз с сервера на клиент список авторов включая их имена и многие другие параметры (не указаны в структуре XML документа только чтобы упростить понимание задачи) - довольно накладно, тем более что эти параметры неизменны.
Идея - пересылать из базы данных только Идентификаторы авторов и в соответствии с ними собирать окончательный список авторов уже на клиенте, используя XML документ храняшийся на клиенте. Непонятно только как собственно делать выборку только тех элементов из XML документа, ID которых совпадают с ID пересланных с сервера. Какие будут идеи и предложения ?
Glory
Дата: 15.10.2003 09:56:40
DECLARE @idoc int

DECLARE @doc varchar(1000)
SET @doc ='
<ROOT>
<Authors>
<Author>
<ID>1</ID>
<Name>A</Name>
</Author>
<Author>
<ID>2</ID>
<Name>B</Name>
</Author>
<Author>
<ID>3</ID>
<Name>C</Name>
</Author>
</Authors>
</ROOT>'

create table #MyResultDataSet(myid int)
--insert #MyResultDataSet exec dbo.myproc



--Create an internal representation of the XML document.

EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
-- Execute a SELECT statement that uses the OPENXML rowset provider.

SELECT a.*
FROM OPENXML (@idoc, '/ROOT/Authors/Author',2)
WITH(id int 'ID', name varchar(100) 'Name') AS a
INNER JOIN #MyResultDataSet b on b.myid = a.id

EXEC sp_xml_removedocument @idoc

drop table #MyResultDataSet
qu-qu
Дата: 15.10.2003 10:53:58
Glory показал как это сделать на стороне сервера, а вот тут можете посмотреть как на стороне клиента.\r
\r
Удачи!