нужна помощь относительно запросов XML на сервере SQL - PullRequest
0 голосов
/ 01 июня 2011

У меня две таблицы в SQL Server 2005. В одной таблице table1 есть один столбец, тип данных которого xml, где мы сохраняем данные в формате xml. Теперь у меня есть другая таблица table2, где мы храним несколько имен файлов. так что теперь я хочу написать запрос в таких данных на XML, который будет возвращать значение тех полей, которые определены в таблице 2. как добиться этого с помощью простого оператора SQL вместо процедуры хранения.

моя структура XML и данные, как показано ниже

<Record xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <DELETED>
    <JID>41185</JID>
    <WID>0</WID>
    <AccountReference>LH169</AccountReference>
    <OEReference>Ari002</OEReference>
    <InvoiceNumber>0</InvoiceNumber>
    <OrderPlacedBy>Mark Catterall</OrderPlacedBy>
    <Specialist>0FFICINA MOTTAUTO</Specialist>
    <Priority>2</Priority>
    <JobType>OUR</JobType>
    <JobState>NOTSTARTED</JobState>
    <JobAddedDate>2011-05-31T16:17:00</JobAddedDate>
    <JobStartedDate>2011-05-31T16:18:00</JobStartedDate>
    <JobFinishedDate>1777-01-01T00:00:01</JobFinishedDate>
    <JobShippedDate>1777-01-01T00:00:01</JobShippedDate>
    <RecievedDate>1777-01-01T00:00:01</RecievedDate>
    <UPSShippingNumber />
    <CustomerName>02 IRELAND</CustomerName>
    <ContactName>ALAN CONLAN</ContactName>
    <Telephone>00353868377926</Telephone>
    <StandardHours>3.00</StandardHours>
    <JobDescription>test for search 2</JobDescription>
    <UserName xsi:nil="true" />
    <AwaitingCustomer>0</AwaitingCustomer>
    <ReturnToCore>0</ReturnToCore>
    <AwaitingFromSalvage>0</AwaitingFromSalvage>
    <PartDescription>test for search 2</PartDescription>
    <PostalCode>IRELAND</PostalCode>
    <OURPrice xsi:nil="true" />
    <ExchangePrice xsi:nil="true" />
    <NewPrice xsi:nil="true" />
    <eBayPrice xsi:nil="true" />
    <Status>UPDATED</Status>
  </DELETED>
</Record>

предположим, в моей таблице2 несколько полей хранятся как JID, WID, AccountReference, OEReference, InvoiceNumber.

поэтому, пожалуйста, объясните мне, как написать sql для данных xml, который будет возвращать только данные JID, WID, AccountReference, OEReference, InvoiceNumber из данных xml, но имя файла не будет жестко закодировано, а будет получено из другой таблицы table2.

пожалуйста, направь меня.

1 Ответ

1 голос
/ 01 июня 2011

Для чтения данных из xml вы можете использовать вот так:

    Select
    MyXmlColumn.value('(Record/DELETED/JID)[1]', 'int' ) as JID,
    MyXmlColumn.value('(Record/DELETED/WID)[1]', 'int' ) as WID,
    MyXmlColumn.value('(Record/DELETED/AccountReference)[1]', 'nvarchar(255)' ) as AccountReference from table2

[update]

создать хранимую процедуру с вашими параметрами:

create procedure getmyxmldata
(
    @param1 varchar(50),
    @param2 varchar(50)
)
as
begin    
    declare @myQuery varchar(1000);
    set @myQuery = 'Select
        MyXmlColumn.value(''(Record/DELETED/' + @param1 + ')[1]'', ''nvarchar(255)'' ) as ' + @param1 + ',
        MyXmlColumn.value(''(Record/DELETED/' + @param1 + ')[1]'', ''nvarchar(255)'' ) as ' + @param1 + ' from table2';

EXEC sp_executesql @myQuery
end

ItТакже возможно прочитать указанные поля из другой таблицы в этой хранимой процедуре и динамически создать оператор выбора без передачи параметров.


[Обновление 2]

Вы можете попробовать это для нескольких удаленных тегов:

Select
Row.value('(./JID)[1]', 'int' ) as JID,
Row.value('(./WID)[1]', 'int' ) as WID,
Row.value('(./AccountReference)[1]', 'nvarchar(255)' ) as AccountReference 
from table2
CROSS APPLY MyXmlColumn.nodes('/Record/DELETED') as Record(Row)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...