【问题标题】:How to compare varbinary in where clause in SQL Server如何比较 SQL Server 中 where 子句中的 varbinary
【发布时间】:2011-07-11 10:03:10
【问题描述】:

我想将varbinary 类型与字节数组进行比较。到目前为止我已经尝试过:

DECLARE @data AS NVARCHAR(MAX)='4283'

Select * from table1 Where bindayData=CAST(@data AS VARBINARY)

但这不起作用。

我注意到一个奇怪的行为:当我像静态一样使用它时

Select * from table1 Where bindayData=CAST('4283' AS VARBINARY)

然后它工作正常。但是当我声明一个变量时,它就不起作用了。

请分享你的想法。

谢谢, 纳雷什·戈拉达拉

【问题讨论】:

  • 除了 gbn 的回答之外,您还应该注意,在没有长度说明符 limits the length to 30 的情况下转换为 VARBINARY

标签: sql sql-server-2008 comparison bytearray varbinary


【解决方案1】:

试试

DECLARE @data AS NVARCHAR(MAX)='4283'

字符串常量'4283' 在 CAST 中是非 unicode,每个字符一个字节。
这给出了 4 个字节的 varbinary 0x34323833

当您使用 NVARCHAR(MAX) 时,它会更改为 unicode N'4283'string,每个字符 2 个字节。
这给出了 8 个字节的 varbinary,类似于 0x0034003200380033

【讨论】:

  • gbn 所说的示例 SELECT '4283',N'4283',CAST('4283' AS VARBINARY),CAST(N'4283' AS VARBINARY)
【解决方案2】:

在转换函数中使用样式 2 不会截断最终结果。它省略了“0x”前缀,本质上将结果转换为非二进制结果。 请参阅 Microsoft 的文档。底部有一个例子: https://docs.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql?view=sql-server-ver15

Select * 
from table1 
Where convert(varchar(max),bindayData,2) like '%4283%'

【讨论】:

  • 请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助、质量更好,并且更有可能吸引投票。
  • CONVERT 中的第三个参数只能在转换日期或时间时使用。
  • @Luuk 不正确,请参阅 Microsoft 文档。 docs.microsoft.com/en-us/sql/t-sql/functions/…
  • @MichaelRiley-AKAGunny 好的,我应该向下滚动……你是对的!
  • @Luuk 我昨天遇到了这个。每天我都会在 SQL 表中更新公司的 Active Directory 列表。并非所有领域都只是某些领域。 objectGUID 保存为 varbinary。我尝试使用 like 搜索此字段,但未能产生结果。在我搜索一个易于使用的查询时,我遇到了一个使用 convert with style = 2 的示例。它就像一个冠军。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-15
  • 1970-01-01
  • 2015-11-17
  • 2015-06-26
  • 1970-01-01
  • 2013-11-25
相关资源
最近更新 更多