Что не так с этим OpenXML? - PullRequest
       25

Что не так с этим OpenXML?

3 голосов
/ 23 сентября 2010
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 ]

2 голосов
/ 23 сентября 2010

Зачем вообще беспокоиться о неуклюжих вещах OpenXML ??Просто используйте базовую поддержку XQuery в SQL Server, чтобы сделать это более элегантно:

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)
2 голосов
/ 23 сентября 2010

По умолчанию OPENXML будет искать значения атрибутов или дочерние элементы для данных.Если вы напишите свой выбор как:

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

Это должно работать нормально.Обратите внимание на добавление text () в отображение схемы, чтобы указать, что мы просто хотим получить текстовое значение узла вместо любого значения атрибута.

...