2012-09-26 52 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

相关问题