4

現在、HTTPリクエストに応答するC#アプリケーションがあります。HTTPリクエスト(XML)の本文はSQL Serverに渡され、その時点でデータベースエンジンは正しい命令を実行します。指示の1つは、顧客のID(InvoiceLoad)を使用して請求書に関する情報をロードするために使用されます。

<InvoiceLoad ControlNumber="12345678901">
   <Invoice>
      <CustomerID>johndoe@gmail.com</CustomerID>
   </Invoice>
</InvoiceLoad>  

請求書テーブル(関連付けられた電子メールアドレスを含む)に対してSELECT操作を実行する必要があります。

私は使用してみました:

SELECT 'Date', 'Status', 'Location' 
FROM Invoices 
WHERE Email_Address = Invoice.A.value(.)  

using an xml.nodes('InvoiceLoad/Invoice/CustomerId') Invoice(A)

指図。

ただし、このクエリは1分間に数千回実行される可能性があるため、できるだけ速くしたいと思います。これを行う1つの方法は、CROSS APPLY(これまで使用したことがない)を使用することかもしれないと聞いています。それが解決策ですか?そうでない場合、このクエリをできるだけ速く行うにはどうすればよいでしょうか。すべての提案は大歓迎です!

4

1 に答える 1

1

なぜ呼び出しが必要になるのかわかりません.nodes()-私が理解していることから、各XMLフラグメントには1つのエントリしかありません-そうですか?

したがって、このXMLを考えると:

<InvoiceLoad ControlNumber="12345678901">
   <Invoice>
      <CustomerID>johndoe@gmail.com</CustomerID>
   </Invoice>
</InvoiceLoad>  

<CustomerID>このSQLを使用して、ノードの値を取得できます。

DECLARE @xmlvar XML

SET @xmlvar = '<InvoiceLoad ControlNumber="12345678901">
   <Invoice>
      <CustomerID>johndoe@gmail.com</CustomerID>
   </Invoice>
</InvoiceLoad>'

SELECT 
   @xmlvar.value('(/InvoiceLoad/Invoice/CustomerID)[1]', 'varchar(100)') 

そして、あなたはあなたの顧客テーブルまたはあなたがする必要があるものに対してこれに参加することができます。

XMLがテーブルに格納されていて、常にその値を抽出する必要がある場合は、そのテーブルに計算された永続化された列を作成して、その電子メールアドレスを別の列に抽出する<CustomerID>ことも考えられます。その後、簡単に参加するために使用します。これには少しの作業が必要です-入力として受け取るストアド関数-しかし、XMLから特定の重要なデータスニペットを「表面化」するための非常に優れた方法です。XML

ステップ1:関数を作成する

CREATE FUNCTION dbo.ExtractCustomer (@input XML)
RETURNS VARCHAR(255)
WITH SCHEMABINDING
AS BEGIN
    DECLARE @Result VARCHAR(255)

    SELECT 
        @Result = @Input.value('(/InvoiceLoad/Invoice/CustomerID)[1]', 'varchar(255)') 

    RETURN @result
END

したがって、XMLが与えられると、1つの<CustomerID>ノードを取得し、その「内部テキスト」を抽出して、それをとして返しますVARCHAR(255)

ステップ2:計算された永続化された列をテーブルに追加します

ALTER TABLE dbo.YourTableWithTheXML
ADD CustomerID AS dbo.ExtractCustomer(YourXmlColumnHere) PERSISTED

これで、XML列を持つテーブルに新しい列がCustomerIDあります---これは自動的にの内容を<CustomerID>として含みますVARCHAR(255)。値は保持されます。つまり、XMLが変更されない限り、再計算する必要はありません。その列はテーブルの他の列と同じように使用でき、インデックスを付けて結合を高速化することもできます。

于 2012-06-20T19:00:22.123 に答える