2010-09-23 26 views
3
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 

,我執行的方式是這樣的: -這個OpenXML有什麼問題?

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

我看到越來越空表中插入。有誰能指出這個錯誤嗎?

+1

我不知道很多有關OpenXML,但是從一個XPath的角度來看,你嘗試'SELECT * FROM的OpenXML(@hDoc」 /歌手/歌手/文()')'?您的XPath選擇元素...也許選擇不會將它們轉換爲它們的文本內容,除非您明確提出要求。 – LarsH 2010-09-23 08:17:13

+0

你在說哪種OpenXml? Microsoft Office使用的格式?然後我不明白這與你的SQL查詢有什麼關係。你可以添加更多的細節嗎? – 2010-09-23 08:23:59

+0

@ 0xA3,我正在談論Sql server中的OpenXML語句。 – 2010-09-23 08:59:29

回答

2

默認情況下,OPENXML將查看數據的屬性值或子元素。如果你寫你的選擇爲:

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

它應該工作正常。注意在模式映射中添加了'text()'來指定我們只需要節點的文本值而不是任何屬性值。

+0

+1,絕對有效。我完全錯過了「文本()」部分。謝謝! – 2010-09-23 11:18:28

2

爲什麼即使打擾笨重的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) 
+0

XQuery在性能方面更好嗎? – 2010-09-23 09:03:01

+0

@ydobomai:不確定 - 取決於您的XML,大小,結構和硬件。嘗試一下!嘗試兩種方法和措施 - 這是知道唯一可靠的方法.... – 2010-09-23 10:31:55