SQL Server:CASE语句varbinary比较具有意外行为

时间:2015-12-28 22:02:36

标签: sql sql-server-2014 comparison-operators varbinary case-statement

更新: 看来可能有一些证书或规则在带有enrypted列数据的打开查询上运行。我发现以下内容产生了一个未加密的值concat&more 39; more'。我将不得不与我们的DBA核实可能导致此行为的原因。

case when s.EncryptedColumn is not null then concat(s.[EncryptedColumn], ' more') else s.[RawColumn] end

我正在尝试对varbinary(16)列进行简单的比较,但是我无法得到返回true的结果。

这就是我的尝试:

尝试1:

select 
    s.[EncryptedColumn], 
    (case when s.[EncryptedColumn] is not null 
            then s.[EncryptedColumn] 
            else s.[RawColumn] 
     end) as 'result'

结果1:加密数据,原始数据

尝试2:

select 
    datalength(s.[EncryptedColumn]), 
    (case when datalength(s.[EncryptedColumn]) > 0 
            then s.[EncryptedColumn] 
            else s.[RawColumn] 
     end) as 'result'

结果2:加密数据长度(16),原始数据

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

如果我做对了,你应该看看here

  

使用ISNULL(DATALENGTH(内容), - 1)代替,以便你可以   区分长度0和NULL。或者只使用DATALENGTH(内容)

答案 1 :(得分:0)

更新: 看来可能有一些证书或规则在带有enrypted列数据的打开查询上运行。我发现以下内容产生了一个未加密的值concat&more 39; more'。我将不得不与我们的DBA核实可能导致此行为的原因。

case when s.EncryptedColumn is not null then concat(s.[EncryptedColumn], ' more') else s.[RawColumn] end