2012-09-26 55 views
0

因此,我在ASP.NET窗體上有一個checkboxlist。我需要在存儲過程(SQL Server 2008)中將所選checkboxes的ID作爲IN子句的一部分。非常簡單 - 假設用戶選擇1,2,4,7,那麼我的程序會詢問值爲TranCode IN (1,2,4,7)。由於我不能動態地執行IN聲明,並且我不想動態構建查詢,所以我認爲XML將是一個不錯的選擇。SQL Server 2008 XML輸入參數存儲過程傳入​​「IN」子句值

我正是如此建設VB.NET中的XML字符串 - <chargecode><refnum>1</refnum><refnum>2</refnum></chargecode>TranCodeRefNum表示相同的領域,他們的交易表和說明表之間只是名稱不同,所以我可以改變refnum到別的在我的XML中,如果需要的話,但我肯定會使用TranCode作爲比較列。

在我的存儲過程中,我聲明瞭一個名爲@ChargeCodesXML的XML變量,它將包含從VB.NET傳入的XML字符串。基本上我需要做的是將所有的refnum字段從XML文件中提取出來,以便與TranCode進行比較。該程序有幾個連接,一些聚合函數,分組依據,等等,但基本上我想是這樣

SELECT * FROM SomeTable WHERE TranCode IN (SELECT RefNum FROM MyXMLFile) 

我一直在尋找周圍,看到了許多複雜的XML查詢,但沒有什麼作爲簡單我需要,所以我有點被我看到的例子所淹沒。有人可以告訴我如何修改我的proc這個非常簡單的比較?

謝謝! 邁克

回答

1
SELECT * 
FROM SomeTable 
WHERE TranCode IN (
        SELECT T.N.value('(./text())[1]', 'int') 
        FROM @ChargeCodesXML.nodes('/chargecode/refnum') AS T(N) 
       ) 
+0

太棒了!像魅力一樣工作。謝謝! – Mike

2

像這樣的事情應該排序您的問題:

SELECT * FROM SomeTable WHERE TranCode IN (
    SELECT 
    ChargeCode.RefNum.value('.', 'INT') 
    FROM 
    @ChargeCodesXML.nodes('/chargecode/refnum') AS ChargeCode(RefNum) 
) 

的關鍵部分,這個查詢您使用nodes方法碎化的XML。如果您將花費大量的時間在SQL Server 2008中使用XML,我建議您閱讀一些相關內容。

+0

謝謝!這工作也很好! – Mike

相關問題