这个OpenXML有什么问题?

时间:2010-09-23 08:08:30

标签: sql-server openxml

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>'

我看到NULL被插入表中。有谁可以指出错误?

2 个答案:

答案 0 :(得分:2)

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

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

它应该可以正常工作。请注意在架构映射中添加'text()'以指定我们只需要节点的文本值而不是任何属性值。

答案 1 :(得分:2)

为什么甚至打扰笨重的OpenXML东西?只需使用SQL Server中的基本XQuery支持就可以更加优雅地执行此操作:

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)