天天看點

使用XML向SQL Server 2005批量寫入資料——一次有關XML時間格式的折騰經曆

<a href="http://www.cnblogs.com/lonelyxmas/p/4135342.html">使用XML向SQL Server 2005批量寫入資料——一次有關XML時間格式的折騰經曆</a>

常常遇到需要向SQL Server插入批量資料,然後在存儲過程中對這些資料進行進一步處理的情況。存儲過程并沒有數組、清單之類的參數類型,使用XML類型可妥善解決這個問題。

不過,SQL Server2005對标準xml的支援不足,很多地方需要特别處理。舉一個例子說明一下。

這個場景是往存儲過程裡傳遞一個xml序列化了的List&lt;Model&gt;。

1.Model的代碼如下,這是一個實體類

使用XML向SQL Server 2005批量寫入資料——一次有關XML時間格式的折騰經曆
使用XML向SQL Server 2005批量寫入資料——一次有關XML時間格式的折騰經曆
使用XML向SQL Server 2005批量寫入資料——一次有關XML時間格式的折騰經曆
使用XML向SQL Server 2005批量寫入資料——一次有關XML時間格式的折騰經曆

使用的時候隻需要:string xml = DbXml.SerializeXml&lt;List&lt;QQVisitorXml&gt;&gt;(list) 即可擷取序列化後的xml字元串:

使用XML向SQL Server 2005批量寫入資料——一次有關XML時間格式的折騰經曆
使用XML向SQL Server 2005批量寫入資料——一次有關XML時間格式的折騰經曆

2.存儲過程裡,讀取xml到一個臨時表#temp裡:

然後就可以對#temp按照普通表進行進一步處理。

我們試着執行這個存儲過程。嗯?出錯了?!

3.原來,XML的時間标準格式是”年-月-日T時:分:秒-時區” SQL Server2005不支援時區,是以它也不能支援xml的時間格式(倒是支援年-月-日T時:分:秒)。這個問題在SQL server 2008中得到改進,完整支援了xml的時間格式。但是我們資料庫是2005,沒辦法,得想個辦法解決。解決辦法是把時間字轉成字元串,然後截取 年-月-日T時:分:秒,最後再加上東八區的時區數,這樣sql修正為:

本地測試,成功!

4.放到伺服器上測試,執行倒是成功了,可以一檢視資料,又出問題了!伺服器上插入資料表的時間,和我本地測試資料庫的時間,相差8個小時!本地開發環境是windows8,伺服器是windows server 2008。開發環境和伺服器環境有差異,導緻本地擷取xml帶時區,伺服器不帶時區。

過于依賴環境,就太危險了!果斷放棄時間格式,修改Model中時間為字元串:

使用XML向SQL Server 2005批量寫入資料——一次有關XML時間格式的折騰經曆
使用XML向SQL Server 2005批量寫入資料——一次有關XML時間格式的折騰經曆

在存儲過程中把這個時間字元串轉換成時間:

Ok。所有問題都解決了,暢快。