0

所以我有checkboxlist一个 ASP.NET 表单。我需要选择的 ID作为存储过程 ( )checkboxes中子句的一部分。非常简单——假设用户选择, , , , 那么我的程序会询问 where 的值。由于我不能做动态语句,而且我不想动态构建查询,我认为 XML 会是一个不错的选择。 INSQL Server 20081247TranCode IN (1,2,4,7)IN

因此,我在 VB.NET -<chargecode><refnum>1</refnum><refnum>2</refnum></chargecode>等 中构建 XML 字符串TranCodeRefNum表示相同的字段,它们只是在事务表和描述表之间命名不同,因此refnum如果需要,我可以在我的 XML 中更改为其他内容,但是我肯定要使用TranCode比较列。

在我的存储过程中,我声明了一个名为 的 XML 变量@ChargeCodesXML,它将包含从 VB.NET 传入的 XML 字符串。基本上,我需要做的就是将所有引用句柄字段从 XML 文件中拉出,以便与TranCode. 该过程有几个连接,一些聚合函数,分组等,但基本上我想要类似的东西

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

我一直在四处搜索,看到了许多复杂的 XML 查询,但没有什么比我需要的更简单,所以我对我看到的示例感到不知所措。有人可以告诉我如何为这个非常简单的比较修改我的过程吗?

谢谢!麦克风

4

2 回答 2

2

这样的事情应该解决你的问题:

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

此查询的关键部分是您使用节点方法来分解 XML。如果您打算在 SQL Server 2008 中花费大量时间使用 XML,我建议您阅读一下这方面的内容。

于 2012-09-26T20:47:05.570 回答
1
SELECT * 
FROM SomeTable 
WHERE TranCode IN (
                  SELECT T.N.value('(./text())[1]', 'int')
                  FROM @ChargeCodesXML.nodes('/chargecode/refnum') AS T(N)
                  )
于 2012-09-26T20:43:04.450 回答