【问题标题】:Converting timestamp to xml将时间戳转换为xml
【发布时间】:2011-08-13 21:45:12
【问题描述】:

可以做到以下几点:

SELECT SomeTimestampColumn FROM SomeTable FOR XML PATH('')

结果看起来像一个字符串 例如

<SomeTimestampColumn >AAAAAATJ2y4=</SomeTimestampColumn>

但由于某种原因,SQL 不允许我这样做

从 SomeTable 中选择 CONVERT(xml,SomeTimestampColumn)

这里有两个相关的问题:

  1. 是否有其他方法(除了 XML PATH(''))从 sql 中获取等效字符串或
  2. 是否有更好的方法来捕获/转换该时间戳为更易于操作的字符串(我需要在 ac# 应用程序之间来回传递它,并将使用它来确定没有其他人更改了同时)

谢谢, 迈克

【问题讨论】:

    标签: sql-server xml timestamp


    【解决方案1】:
    declare @T table(SomeTimestampColumn timestamp, id int)
    
    insert into @T(id) values(1)
    insert into @T(id) values(2)
    
    select 
      (select SomeTimestampColumn for xml path('')) as SomeTimestampColumn
    from @T
    

    如果您希望列是 XML 类型

    select 
      (select SomeTimestampColumn for xml path(''), type) as SomeTimestampColumn
    from @T
    

    或者如果你只想要价值

    select
      T1.ID,
      T3.N.value('.', 'varchar(50)') as SomeTimestampColumn
    from @T as T1
      cross apply
        (select T1.SomeTimestampColumn for xml path(''), type) as T2(X)
      cross apply
        T2.X.nodes('SomeTimestampColumn') as T3(N)
    

    结果

    ID          SomeTimestampColumn
    ----------- --------------------------------------------------
    1           AAAAAAACDZg=
    2           AAAAAAACDZk=
    

    转换为 Base64,您可以将其转换回来。这是一些可以进行转换的 UDF 的链接。 http://www.vbforums.com/showthread.php?t=554886

    declare @T table(SomeTimestampColumn timestamp, id int)
    
    insert into @T(id) values(1)
    
    declare @Base64 varchar(max)
    declare @Binary varbinary(max)
    
    select
      @Binary = T1.SomeTimestampColumn,
      @Base64 = T3.N.value('.', 'varchar(50)')
    from @T as T1
      cross apply
        (select T1.SomeTimestampColumn for xml path(''), type) as T2(X)
      cross apply
        T2.X.nodes('SomeTimestampColumn') as T3(N)
    
    select
      @Base64,
      CAST(N'' AS XML).value('xs:base64Binary(xs:hexBinary(sql:variable("@Binary")))', 'VARCHAR(MAX)'),
      @Binary,
      CAST(N'' AS XML).value('xs:base64Binary(sql:variable("@Base64"))', 'VARBINARY(MAX)')
    

    结果:

    AAAAAAAAJ3k=    AAAAAAAAJ3k=    0x0000000000002779  0x0000000000002779
    

    【讨论】:

    • 所有好的 sn-ps,谢谢,现在测试每个,看看什么最有效。
    • 您知道它对时间戳类型做了什么以将其转换为 XML 吗?我唯一担心的是这似乎是一种单向转换(转换回 Binary(8) 似乎会产生垃圾),我不确定它是否总是会生成唯一的字符串行?
    • @Runonthespot - 转换为base64,可以再次转换回二进制。
    【解决方案2】:

    这就是你想要做的:

    SELECT convert(datetime, SomeTimestampColumn) 
    FROM SomeTable FOR XML PATH('SomeTimestampColumn')
    

    【讨论】:

    • 感谢您的回答,但它特别是“时间戳”数据类型,它不是日期时间 - 它基本上是一种内部数据类型,只能转换为二进制(8),我不知道如何以可预见的方式将其转换为类似 xml 的字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-20
    • 2013-04-07
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多