2010-05-03 65 views
0

有人可以提供一個如何從C#發送xml到SQL Server的示例,然後在獲取它的存儲過程中的xml上循環,並逐行更新或輸入。發送xml到sql

+0

SqlServer的哪個版本?較新的版本有'xml'數據類型。 – 2010-05-03 08:06:06

+0

sql版本2005 – 2010-05-03 08:21:36

回答

1

查看關於SQL XML的三部分系列15秒: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

+0

聽起來像我在找什麼。 TY – 2010-05-03 11:52:26

-1

我做了很多假設,因爲你的問題不清楚。

你可以做的是在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 
+0

哇...我的新代碼。你能解釋一下這裏發生了什麼嗎? TY。 – 2010-05-03 08:15:37

+0

-1適用於不使用XML數據類型的舊式XML處理。 – 2012-02-27 17:31:14