Sql server 使用RowVersion查询SQL Server表
我正在使用ADODB从VBA查询SQL Server。我所有的表都有RowVersion(timestamp/varbinary)列。由于VBA不支持varbinary类型,因此我将RowVersion从SQL Server函数转换为字符串。一个简单的查询如下所示:Sql server 使用RowVersion查询SQL Server表,sql-server,excel,vba,Sql Server,Excel,Vba,我正在使用ADODB从VBA查询SQL Server。我所有的表都有RowVersion(timestamp/varbinary)列。由于VBA不支持varbinary类型,因此我将RowVersion从SQL Server函数转换为字符串。一个简单的查询如下所示: sql = "SELECT NameValueListID, dbo.RowVersionToString(RowVersion) AS RowVersion FROM NameValueLists WHERE NameValueL
sql = "SELECT NameValueListID, dbo.RowVersionToString(RowVersion) AS RowVersion FROM NameValueLists WHERE NameValueListID=1
sql = "SELECT NameValueListID, dbo.RowVersionToString(RowVersion) AS RowVersion, dbo.RowVersionToString(LastItemRowVersion) AS LastItemRowVersion FROM NameValueLists WHERE NameValueListID=1
为了将数据放到工作表上,我首先尝试了range.CopyFromRecordset。这一直有效,直到我在sql调用中包含了上述函数。添加RowVersionString函数会导致记录集返回一组看似随机的数据——比excepted少的行和比我要求的少的列。我永远也想不到。然后,我使用rs.GetRows返回预期数据,我可以成功地使用range.value=rsData。下面是一个有效的示例调用
Private Sub Test_Scratch()
Dim rs As ADODB.Recordset
Dim sqlCmd As New ADODB.Command
Dim sqlConnection As ADODB.Connection
Dim sql As String
Dim rsData() As Variant
Set sqlConnection = New ADODB.Connection
sqlConnection.Open ModSQL.GetConnectionStringByStage(wsSetup.Range("suAppStage"))
sql = "SELECT NameValueListID, dbo.RowVersionToString(RowVersion) AS RowVersion FROM NameValueLists WHERE NameValueListID=1"
Set sqlCmd.ActiveConnection = sqlConnection
sqlCmd.CommandText = sql
Set rs = sqlCmd.Execute
rs.MoveFirst
rsData = rs.GetRows
End Sub
然后,我在查询中添加了第二个varbinary列(它不是RowVersion,而是同一类型)。因此,sql将如下所示:
sql = "SELECT NameValueListID, dbo.RowVersionToString(RowVersion) AS RowVersion FROM NameValueLists WHERE NameValueListID=1
sql = "SELECT NameValueListID, dbo.RowVersionToString(RowVersion) AS RowVersion, dbo.RowVersionToString(LastItemRowVersion) AS LastItemRowVersion FROM NameValueLists WHERE NameValueListID=1
调用后,记录集rs拥有所有数据,但rsData的第一个varbinary列为“Empty”。顺序不重要。只有最后一个varbinary列有一个值,另一个在rsData数组中总是“空的”。为什么在查询中需要时间戳值?很好奇您想用它做什么。@SeanLange因为这是实现乐观并发的一种非常简单的方法。应用程序将读取具有该值的行。稍后,当它想以某种方式更新行时,它会在where子句中包含原始值。如果更新不影响行,则应用程序知道它在检索后已更改。我可以使用rowversion仅获取更改的行。所以我下载了一些记录,然后我可以得到最大Rowversion,然后得到新的/更新的记录,这些记录的Rowversion>maxRowVersionrsData是一个数组。具体如何将rsData导入Excel电子表格?我使用了SELECT NameValueListID、cast(RowVersion为bigint)、cast(LastItemRowVersion为bigint)和rsData(0,0)、rsData(1,0)、rsData(2,0)都有值