Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 这个OpenXML有什么问题?_Sql Server_Openxml - Fatal编程技术网

Sql server 这个OpenXML有什么问题?

Sql server 这个OpenXML有什么问题?,sql-server,openxml,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 E

我执行的方式是:-

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

我看到NULL被插入到表中。有人能指出错误吗?

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

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

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

为什么还要处理笨重的OpenXML内容呢??只需使用SQL Server中的基本XQuery支持,即可更优雅地执行此操作:

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

我对OpenXML了解不多,但从XPath的角度来看,您是否尝试过从OpenXML(@hDoc,'/Singers/Singer/text()')中选择*?您的XPath选择元素。。。除非您明确要求,否则select不会将它们转换为文本内容。您说的是哪种OpenXml?Microsoft Office使用的格式?那么我看不出这与您的SQL查询有什么关系。您能添加更多详细信息吗?@0xA3,我是说Sql server中的OpenXML语句。@ydobomai:不确定-很大程度上取决于您的XML、大小、结构和硬件。试试看!尝试这两种方法和测量-这是唯一可靠的方法知道….+1,肯定有效。我完全错过了“text()”部分。谢谢
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)