Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 通过xml SQL Server加载日期/时间时出错_Sql Server - Fatal编程技术网

Sql server 通过xml SQL Server加载日期/时间时出错

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&

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</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)