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被插入表中。有谁可以指出错误?
答案 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)