2011-04-27 91 views
1

这是可以做到以下几点:转换时间戳XML

SELECT SomeTimestampColumn FROM SomeTable FOR XML PATH('') 

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

<SomeTimestampColumn >AAAAAATJ2y4=</SomeTimestampColumn> 

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

SELECT CONVERT(XML,SomeTimestampColumn)FROM SomeTable

这里有两个相关的问题:

  1. 有没有其他的方式(除了XML路径(''))从sql或
  2. 是否有更好的方式捕获/ co nverting该时间戳为更可操作的字符串(我需要通过这个来回C#应用程序之间,将用它来确定没有其他人已经改变了排在此期间)

谢谢, 迈克

回答

2
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 
+0

所有好的片段,谢谢,现在测试每个看看什么效果最好。 – Runonthespot 2011-04-27 14:55:03

+0

你知道它是如何将时间戳类型转换为XML的吗?我唯一担心的是,这似乎是一个单向转换(转换回二进制(8)似乎产生垃圾),我不知道它是否会始终生成唯一的字符串行? – Runonthespot 2011-04-27 15:00:35

+0

@Runonthespot - 它被转换为base64,并可以再次转换回二进制。 – 2011-04-27 16:49:47

0

这是你想要做什么:

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

感谢您的回答,但它的具体的“时间戳”的数据类型是不是日期时间 - 它基本上是一个内部数据类型,它只能被转换为二进制(8)我无法预测如何将其转换为类似xml的字符串。 – Runonthespot 2011-04-27 14:18:17