2011-09-13 13 views
0

XML日期時間我正在接收XML參數現在XML存儲過程包含日期和時間字段如何讀取SQL

這裏是我的xml其作爲參數傳遞給存儲過程傳遞的樣品。我使用SQL Server 2005的

<transdetails> 
    <_x005B_Sheet1_x0024__x005D_> 
    <Date_of_transaction>2011-07-29T13:47:34+05:00</Date_of_transaction> 
    <Type_of_the_transaction>card</Type_of_the_transaction> 
    <Card_number>7000460000451470</Card_number> 
    <Total_quantity>27.81</Total_quantity> 
    <Total_amount>2419.75</Total_amount> 
    <Name_of_Retail_Outlet>MIDWAY PETROLEUM SERVICES</Name_of_Retail_Outlet> 
    <Product_Purchased>PETROL</Product_Purchased> 
    </_x005B_Sheet1_x0024__x005D_> 
<transdetails> 

這裏是存儲過程

ALTER PROCEDURE [dbo].[usp_getexceldata] 
    @transdetails xml 
AS 
    SET NOCOUNT ON 
    SET ARITHABORT ON 
BEGIN 
    DECLARE @XML AS XML 

    DECLARE @DestinationTemp TABLE (ID INT IDENTITY(1,1), 
            Date_of_transaction VARCHAR, 
            Type_of_the_transaction nvarchar(255), 
            Card_number nvarchar(255), 
            Total_quantity float, 
            Total_amount float, 
            Name_of_Retail_Outlet nvarchar(255), 
            Product_Purchased nvarchar(255) 
            ) 

    SET @XML = @transdetails 

    INSERT INTO @DestinationTemp(Date_of_transaction, Type_of_the_transaction, Card_number, Total_quantity, Total_amount, Name_of_Retail_Outlet, Product_Purchased) 
     SELECT 
      x.d.query('./Date_of_transaction').value('.' , 'DateTime') Date_of_transaction, 
      x.d.query('./Type_of_the_transaction').value('.', 'nvarchar(255)') Type_of_the_transaction, 
      x.d.query('./Card_number').value('.', 'nvarchar(255)') Card_number, 
      x.d.query('./Total_quantity').value('.' ,'float') Total_quantity, 
      x.d.query('./Total_amount').value('.' , 'float') Total_amount, 
      x.d.query('./Name_of_Retail_Outlet').value('.' ,'nvarchar(255)') Name_of_Retail_Outlet, 
      x.d.query('./Product_Purchased').value('.', 'nvarchar(255)') Product_Purchased 
     FROM 
      @XML.nodes('transdetails//_x005B_Sheet1_x0024__x005D_') x(d) 

    SELECT * FROM @DestinationTemp 

現在,我得到當試圖轉換Date_of_transaction爲datetime,如果我嘗試初始設定值作爲VARCHAR那麼它將返回一個錯誤例如整數值,如果我有時間

2011-07-29T13:47:34+05:00 

它將返回我2 ...請任何幫助嗎?

回答

3

你的插入定義爲Date_of_transaction VARCHAR列因此它將截斷到1個字符,因爲沒有指定的比例,因此2

2

SQL Server 2005不處理日期時間值的時區部分。

您的一個選擇可能是使用substring來獲取沒有時區的日期時間。

x.d.query('./Date_of_transaction').value('substring(., 1, 19)' , 'DateTime') 

您樣本中的結果值爲2011-07-29 13:47:34.000

在SQL Server 2008中,您的查詢將正常工作返回的值將是2011-07-29 08:47:34.000而不是因爲它使用時區值。

順便說一句:你應該改變Date_of_transaction的數據類型爲DateTime@DestinationTemp

+0

謝謝Mikael它適合我:-) – shumaila

+0

@shumaila - 這太棒了。 http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work –