2

在我的一个解决方案中,我正在使用 SQL Server 的更改跟踪功能。为了区分实际应用程序所做的更改和同步应用程序所做的更改,我们使用了更改上下文。现在,据我所知,此更改上下文的类型为 varbinary(128)。

在应用程序逻辑中,我们创建一个字节数组,其中包含一些随机字节用作更改上下文,当同步应用程序进行任何更改时,它会使用此更改上下文。然后,当我们尝试获取实际应用程序所做的更改集时,没有任何更改上下文,我们在查询中使用以下代码片段

SELECT .... from .... WHERE (SYS_CHANGE_CONTEXT != @context OR SYS_CHANGE_CONTEXT IS NULL)

这里,@context 是类型为 VARBINARY(128) 的命令参数,它被添加到 sqlcommand 以获取更改集。无论传递给命令的更改上下文如何,它仍然会获得所有更改。

是否有任何特殊方法可以比较 VARBINARY 值或将它们作为参数发送?

4

1 回答 1

2

从字面上回答你的问题,我确信有特殊的方法来比较 Varbinary(尤其是大型方法,例如预先计算哈希以用作预比较),但是常规的“=”运算符工作得很好:

declare @a varbinary(max) = 0x12345678;
declare @b varbinary(max) = 0x12345678;
declare @c varbinary(max) = 0x12345679;
declare @d varbinary(max) = null;
declare @e varbinary(max) = null;

select iif(@a = @b, 1, 0) as AreEqual -- 1
union all
select iif(@a = @c, 1, 0) as AreEqual -- 0
union all
select iif(@a = @d or @a is null and @d is null, 1, 0) as AreEqual -- 0
union all
select iif(@d = @e or @d is null and @e is null, 1, 0) as AreEqual -- 1

在 C# Entity 框架中,它们显示为 byte[]。我不知道作为参数传递的任何特殊要求 besdies 内存占用。对于较大的(比您的示例)可以使用流(例如12

于 2013-09-16T18:49:39.757 回答