当前位置: 首页 > 面试题库 >

在SQL Server中遍历XML变量

赵永新
2023-03-14
问题内容

我在存储过程(SQL Server 2008)中有一个XML变量,其示例值为

<parent_node>
   <category>Low</category>
   <category>Medium</category>
   <category>High</category>
</parent_node>

我必须采用每个类别并将其作为单独的记录插入表中。如何在XML中进行迭代并获取单个节点的值?

如果我想调用存储过程并将每个类别作为输入参数发送,我们该怎么做?该存储过程是旧式存储过程,一次只能接受一个类别。我正在尝试以这种方式调用过程。

  1. 循环从xml变量获取单个类别。
  2. 用当前类别调用存储过程。
  3. 移至下一个类别。
  4. 循环直到列表包含值。

任何帮助将不胜感激。


问题答案:

像这样吗?

DECLARE @XmlVariable XML = '<parent_node>
                              <category>Low</category>
                              <category>Medium</category>
                              <category>High</category>
                            </parent_node>'

INSERT INTO dbo.YourTargetTable(CategoryColumn)
  SELECT 
     XTbl.Cats.value('.', 'varchar(50)')
  FROM 
     @XmlVariable.nodes('/parent_node/category') AS XTbl(Cats)

更新: 如果您 必须
使用旧的旧式存储过程并且不能更改它(这是我的首选方式),那么您将不得不自己进行逐行行(RBAR)循环,例如通过使用一个表变量:

-- declare temporary work table
DECLARE @RbarTable TABLE (CategoryName VARCHAR(50))

-- insert values into temporary work table
INSERT INTO @RbarTable(CategoryName)
  SELECT 
     XTbl.Cats.value('.', 'varchar(50)')
  FROM 
     @XmlVariable.nodes('/parent_node/category') AS XTbl(Cats)

-- declare a single category
DECLARE @CategoryNameToBeInserted VARCHAR(50)

-- get the first category
SELECT TOP 1 @CategoryNameToBeInserted = CategoryName FROM @RbarTable

-- as long as we have data
WHILE @CategoryNameToBeInserted IS NOT NULL
BEGIN
    -- execute your stored procedure here.....    
    EXEC sp_executesql N'dbo.YourStoredProcedure @CategoryName', 
                       N'@CategoryName VARCHAR(50)', 
                       @CategoryName = @CategoryNameToBeInserted

    -- delete the category we just inserted from the temporary work table
    DELETE FROM @RbarTable WHERE CategoryName = @CategoryNameToBeInserted

    -- see if we still have more categories to insert    
    SET @CategoryNameToBeInserted = NULL
    SELECT TOP 1 @CategoryNameToBeInserted = CategoryName FROM @RbarTable ORDER BY CategoryName
END


 类似资料:
  • 在本章中,我们将讨论XML DOM遍历。 在前一章中学习了如何加载XML文档并解析由此获得的DOM对象。 可以遍历解析后的DOM对象以获取每个对象的内容。 遍历是一种通过在节点树中逐步遍历每个元素以系统方式完成循环的过程。 示例 以下示例(traverse_example.html)演示了DOM遍历具体用法。 在这里,将遍历元素的每个子节点。 文件:traverse_example.html -

  • 本文向大家介绍如何在JSP中遍历XML的节点?,包括了如何在JSP中遍历XML的节点?的使用技巧和注意事项,需要的朋友参考一下 <X:的forEach>标记用于遍历XML文档中的节点。 属性 <X:的forEach>标签具有以下属性- 属性 描述 需要 默认 选择 要评估的XPath表达式 是 没有 变种 用于存储每个循环的当前项目的变量名称 没有 没有 开始 迭代的开始索引 没有 没有 结束 迭

  • 我在javascript中有一个简单的函数,它在页面加载时隐藏所有css div: 如你所见,我必须一个一个地把它们藏起来。有没有一种方法可以将这些存储到一个数组中,然后一次遍历它们?这样,如果我添加了一个新的var链式查询,我就不必再深入函数并手动隐藏它了? 如有任何帮助,将不胜感激。

  • 问题内容: 我有以下代码: 打印出以下内容: {“ active”:{“ label”:“ Active”,“ value”:“ 12”},“ automatic”:{“ label”:“ Automatic”,“ value”:“ 8”},“ waiting”:{ “ label”:“正在等待”,“ value”:“ 1”},“ manual”:{“ label”:“ Manual”,“ val

  • 问题内容: 我在下面的EJS中有代码, 行的输出是正确的,由3个对象组成的数组,每个对象具有属性ID,名称等。我可以操纵行以在JS中填充表格。但是,我想知道是否有一种方法可以通过上述方式完成? 当我运行上面的代码时,JSON.stringify(data).length不是3,而是整个字符串的长度。 另一个问题是当我尝试添加 <%警报(’t’); %>或<%window.alert(’t’); %

  • 本文向大家介绍ajax遍历xml文档的方法,包括了ajax遍历xml文档的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了ajax遍历xml文档的方法。分享给大家供大家参考。具体分析如下: XMLHttpRequest对象提供了两个可以用来访问服务器响应的属性。第一个属性responseText将响应提供为一个串,第二个属性 responseXML将响应提供为一个XML对象。一些简单的