2012-06-20 70 views
4

我目前有一個響應HTTP請求的C#應用​​程序。 HTTP請求(XML)的主體被傳遞給SQL Server,此時數據庫引擎執行正確的指令。其中一個指令是用來加載有關發票信息使用客戶(InvoiceLoad)的ID:使用XML輸入的SQL SELECT

<InvoiceLoad ControlNumber="12345678901"> 
    <Invoice> 
     <CustomerID>[email protected]</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) 

命令。

但是,由於此查詢可能每分鐘運行幾千次,因此我希望儘可能快地完成此操作。我聽說有一種方法可以使用CROSS APPLY(我從未使用過)。這是解決方案嗎?如果不是這樣,我將如何儘快完成這個查詢?任何和所有的建議非常感謝!

回答

1

我不明白你爲什麼需要調用.nodes() - 據我所知,每個XML片段只有一個條目 - 對嗎?

所以給出這個XML:

<InvoiceLoad ControlNumber="12345678901"> 
    <Invoice> 
     <CustomerID>[email protected]</CustomerID> 
    </Invoice> 
</InvoiceLoad> 

你可以使用這個SQL得到<CustomerID>節點的值:

DECLARE @xmlvar XML 

SET @xmlvar = '<InvoiceLoad ControlNumber="12345678901"> 
    <Invoice> 
     <CustomerID>[email protected]</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,你會得到一個<CustomerID>節點,並提取其「內部文本」,並返回它作爲一個VARCHAR(255)

第2步:添加一個計算,堅持列到表現在

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

,你的表具有XML列有一個新列 - CustomerID - 這將自動地包含<CustomerID>的內容作爲VARCHAR(255)。該值是持久的,即只要XML不改變,就不必重新計算。您可以像使用其他任何表格一樣使用該列,並且您甚至可以對其進行索引以加快其上的任何連接!

+0

感謝您的回答!但是,當XML模式更新爲允許多個電子郵件地址時,我會使用什麼。不幸的是,這將在今後6個月左右發生。 – TelJanini

+1

@TelJanini:這是一個固定的最大數量嗎?例如。 1-3個電子郵件地址?或者它基本上是*任何數量的電子郵件地址? –

+0

現在,它只有1個,但在6個月內,我需要處理任意數量的電子郵件地址。再次感謝你的幫助! – TelJanini