代码之家  ›  专栏  ›  技术社区  ›  Itay.B

将XML发送到SQL

  •  0
  • Itay.B  · 技术社区  · 14 年前

    有人能举例说明如何将XML从C发送到SQL Server,然后在获取它的存储过程中循环XML,并逐行更新或输入。

    2 回复  |  直到 12 年前
        1
  •  1
  •   marc_s Anurag    14 年前

    请在15秒内查看由三部分组成的有关SQL XML的系列: http://www.15seconds.com/Issue/050803.htm .

    我个人会使用sql xquery函数将xml分解成小块并存储在sql server中。

    如果你有这样的东西:

    <data>
      <person>
         <name>Jones</name>         
         <firstname>Peter</firstname>
      </person>
      <person>
         <name>Smith</name>         
         <firstname>Frank</firstname>
      </person>
    <data>
    

    你可以这样写:

    SELECT
       Data.Person.value('(name)[1]', 'varchar(20)') as 'Name',
       Data.Person.value('(firstname)[1]', 'varchar(20)') as 'First Name'
    FROM 
       @XmlVar.nodes('/data/person') As Data(Person)
    

    所以基本上, .nodes 函数将XML分解为“伪表” Data.Person -每个 <person> 条目变为表中的一行。

    .value() 函数,可以从这些分解的XML节点中提取单个值。现在有一堆varchar(20)字段,可以插入到表中。

    如果您的xml非常小(几百个条目),那么这个方法可以很好地工作。如果您有大量的xml文件,您可能需要研究其他方法,例如 XML Bulkload .

        2
  •  -1
  •   John Saunders Andrey Morozov    12 年前

    我做了很多假设,因为你的问题不清楚。

    您可以在sql server中创建一个接受字符串作为参数的存储过程。此字符串应包含要处理的XML。有关处理XML的可能存储过程,请参阅以下代码段。

    CREATE PROCEDURE [dbo].[sproc_ProcessXml]
    (
      @data AS NTEXT
    ) 
    AS
    /* Create a temporary table to insert the Xml data*/         
    IF (OBJECT_ID(N'tempdb..#temp') IS NOT NULL )
       DROP TABLE #temp
    
    CREATE TABLE [dbo].[#temp] 
    ( 
      /* your table definition */
    )
    
    DECLARE @handle AS INTEGER
    DECLARE @flags  AS INTEGER 
    
    EXEC sp_xml_preparedocument @handle OUTPUT, @data
    
    /* Supported is only element mapping */ 
    SET @flags = 2
    
    INSERT INTO [dbo].[#temp] 
      SELECT [Insert xml fields] 
      FROM OPENXML (@handle, '[Xpath in XmlDocument', @flags)
      WITH (Id  INTEGER)
    
    EXEC sp_xml_removedocument @handle  
    
    /* Select data from Xml and from several normal tables if needed */
    SELECT  [Insert your Fields]
      FROM dbo.[#temp] t 
    
     DROP TABLE [dbo].[#temp]  
    
    RETURN