代码之家  ›  专栏  ›  技术社区  ›  sachaa

为什么OPENXML只返回一个元素

  •  3
  • sachaa  · 技术社区  · 16 年前

    有人能解释一下为什么这个T-SQL代码只返回一行值为“1”的行吗?我希望得到两行(“1”和“2”)。我是不是遗漏了什么?

    DECLARE @XMLDoc2 XML
    SELECT @XMLDoc2 = '<ids><id>1</id><id>2</id></ids>'
    
    DECLARE @handle2 INT
    
    EXEC sp_xml_preparedocument @handle2 OUTPUT, @XMLDoc2
    
    SELECT * FROM OPENXML (@handle2, '/ids', 2) WITH (id INT 'id') 
    
    EXEC sp_xml_removedocument @handle2
    

    5 回复  |  直到 16 年前
        1
  •  9
  •   marc_s MisterSmith    16 年前

    DECLARE @XMLDoc2 XML
    SELECT @XMLDoc2 = '<ids><id>1</id><id>2</id></ids>'
    
    
    SELECT
       ids.id.value('.', 'int') 'id'
    FROM 
       @xmldoc2.nodes('/ids/id') ids(id)
    

    这给了我预期的“1”和“2”值。

        2
  •  11
  •   stealthyninja michkra    14 年前

    我也有同样的问题,我在另一个网站上找到了答案。必须使用“/ids/id”而不是“/ids”,然后在WITH子句中使用“.”。

    DECLARE @XMLDoc2 XML 
    SELECT @XMLDoc2 = '<ids><id>1</id><id>2</id></ids>' 
    
    DECLARE @handle2 INT 
    
    EXEC sp_xml_preparedocument @handle2 OUTPUT, @XMLDoc2 
    
    SELECT * FROM OPENXML (@handle2, '/ids/id', 2) WITH (id INT '.')  
    
    EXEC sp_xml_removedocument @handle2 
    
        3
  •  7
  •   Remus Rusanu    16 年前

    忘了openxml的无意义性吧,它速度慢、麻烦、不可用,而且很糟糕。使用 XML methods ,它们速度快、直观、用户友好且充满了优点:

    DECLARE @XMLDoc2 XML
    SELECT @XMLDoc2 = '<ids><id>1</id><id>2</id></ids>'
    
    select x.value(N'.', N'int') as id
    from @XMLDoc2.nodes(N'/ids/id') t(x);
    
        4
  •  2
  •   animuson    14 年前
    DECLARE @XMLDoc2 XML
    SELECT @XMLDoc2 = '<ids><id>1</id><id>2</id></ids>'
    DECLARE @handle2 INT
    EXEC sp_xml_preparedocument @handle2 OUTPUT, @XMLDoc2
    SELECT * FROM OPENXML (@handle2, '/ids/id', 2) WITH (id INT '.') 
    EXEC sp_xml_removedocument @handle2
    
        5
  •  0
  •   John Conde    13 年前

    通过使用..向上移动树来指定xpath。。然后指定节点。节点由指定 ../id 和属性 ../@whatever

    SELECT * FROM OPENXML (@handle2, '/ids', 2) WITH (id INT '../id')