代码之家  ›  专栏  ›  技术社区  ›  Ashish Gupta Shiva

这个OpenXML有什么问题?

  •  3
  • Ashish Gupta Shiva  · 技术社区  · 14 年前
    ALTER PROCEDURE GetSingersGenere
    (@SingerData ntext)
    AS
    BEGIN
        DECLARE @hDoc int      
        exec sp_xml_preparedocument @hDoc OUTPUT,@SingerData
    
    
        IF OBject_id('SingerTable') IS NOT NULL
        BEGIN
            DROP TABLE SingerTable
    
        END
    
        CREATE TABLE SingerTable
        (
        SingerName varchar(200)
        )
    
        INSERT INTO SingerTable 
        (
        SingerName
        )
        SELECT * FROM OpenXML (@hDoc,'/Singers/Singer')
        WITH (SingerName varchar(200)) XMLSinger
    
        SELECT * FROM SingerTable
    END
    

    我的执行方式是这是:-

    EXEC GetSingersGenere
     '<Singers>
    <Singer>
    Joe
    </Singer>
    <Singer>
    ACDC
    </Singer>
    </Singers>'
    

    2 回复  |  直到 14 年前
        1
  •  2
  •   Chris W    14 年前

    默认情况下,OPENXML将查看数据的属性值或子元素。如果您将选择写入:

    SELECT * FROM OpenXML (@hDoc,'/Singers/Singer')
        WITH (SingerName varchar(200) 'text()') XMLSinger
    

    应该可以。请注意,在模式映射中添加了“text()”,以指定我们只需要节点的文本值,而不是任何属性值。

        2
  •  2
  •   marc_s HarisH Sharma    14 年前

    ALTER PROCEDURE GetSingersGenre(@SingerData XML)
    AS
    BEGIN
       INSERT INTO dbo.SingerTable(SingerName)
          SELECT
             Singer.Node.value('(.)[1]', 'varchar(50)')
          FROM
             @SingerData.nodes('/Singers/Singer') AS Singer(Node)