我有一个存储过程,它接收xml参数,现在xml包含日期和时间字段
以下是我的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 ...请帮忙吗?
答案 0 :(得分:3)
您插入定义为Date_of_transaction VARCHAR
的列,因此没有指定比例,因此它会截断为1个字符,因此2
。
答案 1 :(得分: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
。