Sql server 通过xml SQL Server加载日期/时间时出错
SQL Server 2016 我通过xml寄存大量记录。我有以下疑问:Sql server 通过xml SQL Server加载日期/时间时出错,sql-server,Sql Server,SQL Server 2016 我通过xml寄存大量记录。我有以下疑问: DECLARE @xmlString VARCHAR(4000); SET @xmlString = N' <Customers> <OrderID>10248</OrderID> <CustomerID>VINET</CustomerID> <CreateDate>10/7/2016 7:31:06 AM&
DECLARE @xmlString VARCHAR(4000);
SET @xmlString = N'
<Customers>
<OrderID>10248</OrderID>
<CustomerID>VINET</CustomerID>
<CreateDate>10/7/2016 7:31:06 AM</CreateDate>
</Customers>
';
DECLARE @xml XML;
SET @xml = CONVERT(XML, @xmlString);
INSERT INTO [test].dbo.[customers]
( [OrderID] ,
[CustomerID] ,
[CreateDate]
)
SELECT T.Customer.value('(OrderID)[1]', 'INT') AS OrderID ,
T.Customer.value('(CustomerID)[1]', 'nvarchar(20)') AS CustomerID ,
T.Customer.value('(CreateDate)[1]', 'DATETIME') AS CreateDate
FROM @xml.nodes('Customers') AS T ( Customer );
通过xml将日期/时间加载到表中时缺少什么转换?谢谢
如果XML日期为mm/dd/yyyy格式,请使用以下内容
将(datetime,T.Customer.value('(CreateDate)[1],'nvarchar(50)),101)转换为CreateDate
如果XML中的日期采用其他格式,如dd/mm/yyyy-请访问下面的链接,了解应该放置什么,而不是101
在您的评论中,您说我正在创建xml。你是怎么做到的
在正确创建的XML中,日期/时间值应为ISO8601
您的几行代码表明,您没有用XML思考。XML不是包含一些额外字符的简单文本
尽管如此,您的格式还是可以使用代码131(适用于dd/mm/yyyyy
或101(适用于mm/dd/yyyyy
)进行转换,,但您不应该这样做强>
DECLARE @xml XML=
N'
<Customers>
<OrderID>10248</OrderID>
<CustomerID>VINET</CustomerID>
<CreateDate>10/7/2016 7:31:06 AM</CreateDate>
</Customers>
';
SELECT c.value('OrderID[1]','int') AS OrderID
,c.value('CustomerID[1]','nvarchar(100)') AS CustomerID
,CONVERT(DATETIME,c.value('CreateDate[1]','nvarchar(100)'),101) AS CreateDate
FROM @xml.nodes('Customers') AS A(c)
DECLARE@xml=
不
10248
葡萄藤
2016年7月10日上午7:31:06
';
选择c.value('OrderID[1],'int')作为OrderID
,c.value('CustomerID[1],'nvarchar(100)')作为CustomerID
,将(DATETIME,c.value('CreateDate[1],'nvarchar(100)),101)转换为CreateDate
从@xml.nodes('Customers')作为一个(c)
最好这样试试
DECLARE @xml2 XML=
N'
<Customers>
<OrderID>10248</OrderID>
<CustomerID>VINET</CustomerID>
<CreateDate>2016-10-07T07:31:06</CreateDate>
</Customers>
';
SELECT c.value('OrderID[1]','int') AS OrderID
,c.value('CustomerID[1]','nvarchar(100)') AS CustomerID
,c.value('CreateDate[1]','datetime') AS CreateDate
FROM @xml2.nodes('Customers') AS A(c)
DECLARE@xml2xml=
不
10248
葡萄藤
2016-10-07T07:31:06
';
选择c.value('OrderID[1],'int')作为OrderID
,c.value('CustomerID[1],'nvarchar(100)')作为CustomerID
,c.value('CreateDate[1],'datetime')作为CreateDate
从@xml2.nodes('Customers')作为一个(c)
如果可能,返回为您创建此XML的人,告诉他们使用ISO 8601作为导出的日期/时间格式<代码>2016-10-07 07:31:06转换的困难要小得多。假设10/7是MM/DD,正如“AM”似乎暗示的那样。。。您永远无法确定本地格式。@jeroen-我正在创建xml。我尝试了ISO 8601(即2006-04-18T09:58:04.570),但仍然失败。我已经在我的机器上运行了这段代码(没有插入),它从XML显示了正确的日期时间。也许是目的地的桌子?可以显示它的创建脚本吗?SELECT子句中的第二列别名是什么?打字错误?在[PRIMARY]上创建表[dbo]。[Customers]([OrderID][INT]NULL,[CreateDate][DATETIME]不为NULL,[CustomerID][NCHAR](10)NULL)对不起,在T.Customer.value('(CreateDate)[1],'nvarchar(50)
Perfect!。。。非常感谢,很抱歉,但这个答案还远远不够完美。这可能会起作用,但在XML中使用datetime值绝对是错误的。我这边的否决票…@Shnugo:你可以否决票,你想否决多少次就否决多少次,但我只回答了具体的要求,如果OP知道XML格式的日期-时间区域性格式,它将在不依赖SQL Server系统的日期-时间的情况下工作。有效的输入XML是入口点,如果不是日期,而是包含垃圾或空值,则所有答案都将失败。希望你明白了没有什么是完美的。@GauravKP-我同意。我向Shnugo解释说我发布了一个代码示例。没有人比我更想要最佳实践。但是,否决和回答是微不足道的。你的解决方案正是我想要的。这篇文章也是这么说的。我像上面那样格式化了日期,它成功了。但我要用@GauravKP回答。我可以按照我的问题中的确切格式留下我的日期,这是有效的。谢谢,我会投票的。@BoundForGlory,你可以做你想做的,但是你应该把你的缺口变成BoundToTroubles:-)@BoundForGlory,你应该在12天之后重新检查你的输出。给定的格式可能看起来正确,但可能会将月份误认为天。依赖特定于区域性的日期时间格式是一个非常坏的习惯!我理解你的话,我感谢你的关心。我展示的只是我的应用程序的一个示例。这不是生产级代码。我只是想转换一个日期/时间。谢谢
DECLARE @xml2 XML=
N'
<Customers>
<OrderID>10248</OrderID>
<CustomerID>VINET</CustomerID>
<CreateDate>2016-10-07T07:31:06</CreateDate>
</Customers>
';
SELECT c.value('OrderID[1]','int') AS OrderID
,c.value('CustomerID[1]','nvarchar(100)') AS CustomerID
,c.value('CreateDate[1]','datetime') AS CreateDate
FROM @xml2.nodes('Customers') AS A(c)