首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL with Binary(n)列

SQL with Binary(n)列
EN

Stack Overflow用户
提问于 2017-12-06 00:33:58
回答 2查看 59关注 0票数 0

我有一个存储过程:

代码语言:javascript
复制
ALTER PROCEDURE [dbo].[spUpdateOrInsertNotification]
    @ContentJsonHash BINARY(32)
AS
    DECLARE @NotificationId INT;

    SET @NotificationId = (SELECT @NotificationId
                           FROM dbo.tblNotifications n
                           WHERE n.ContentJsonHash = @ContentJsonHash);

    IF @NotificationId IS NOT NULL  
    BEGIN
        -- Increment Count
    END
    ELSE
    BEGIN
         -- Insert new row.
    END

它应该检查Hash是否已经存在,如果存在,则递增该行的计数,否则插入该行。但是,它永远找不到散列和相应的NotificationIdNotificationId始终为空。

如果我运行两次,向它传递相同的数据(一个C#数组byte[32])。它永远找不到相同的NotificationId,而我最终只能放入重复的条目。

例如:

代码语言:javascript
复制
NotificationId | ContentJsonHash
9                0xB966C33517993003D789EDF78DA20C4C491617F8F42F76F48E572ACF8EDFAC2A
10               0xB966C33517993003D789EDF78DA20C4C491617F8F42F76F48E572ACF8EDFAC2A

我不能对像这样的二进制(N)字段进行比较吗?WHERE n.ContentJsonHash = @ContentJsonhash

C#代码:

代码语言:javascript
复制
using (var conn = new SqlConnection(Sql.ConnectionString))
{
     await conn.OpenAsync();

     using (var cmd = new SqlCommand(Sql.SqlUpdateOrInsertNotification, conn))
     {
          cmd.CommandType = CommandType.StoredProcedure;

          cmd.Parameters.AddWithValue("@Source", notificationMessage.Source);
          cmd.Parameters.AddWithValue("@Sender", notificationMessage.Sender);
          cmd.Parameters.AddWithValue("@NotificationType", notificationMessage.NotificationType);
          cmd.Parameters.AddWithValue("@ReceivedTimestamp", notificationMessage.Timestamp);
          cmd.Parameters.AddWithValue("@ContentJSon", notificationMessage.NotificationContent);
          cmd.Parameters.AddWithValue("@ContentJsonHash", notificationMessage.ContentHashBytes);

          await cmd.ExecuteNonQueryAsync();
    }
}

我还尝试过像这样从SQL中调用存储过程:

代码语言:javascript
复制
exec dbo.spUpdateOrInsertNotification 'foo', 'bar',  0, 
                                      '2017-12-05 15:23:41.207', '{}',
                              0xB966C33517993003D789EDF78DA20C4C491617F8F42F76F48E572ACF8EDFAC2A

调用这两次将返回2行:(

我可以做到这一点,这是有效的,硬编码我想要检查的二进制字段

代码语言:javascript
复制
select *
from dbo.tblNotifications
where ContentJsonhash = 0xB966C33517993003D789EDF78DA20C4C491617F8F42F76F48E572ACF8EDFAC2A
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-06 16:20:39

我有一个@,我不应该有一个&符号。

代码语言:javascript
复制
SET @NotificationId = (SELECT @NotificationId
                       FROM dbo.tblNotifications n
                       WHERE convert(varchar(32), n.ContentJsonHash, 2) = convert(varchar(32), @ContentJsonHash, 2));

应该是

代码语言:javascript
复制
SET @NotificationId = (SELECT NotificationId
                       FROM dbo.tblNotifications n
                       WHERE convert(varchar(32), n.ContentJsonHash, 2) = convert(varchar(32), @ContentJsonHash, 2));

我太傻了,没有早点注意到这一点:

票数 0
EN

Stack Overflow用户

发布于 2017-12-06 00:48:31

二进制比较可能很棘手。如果你使用的是真正的二进制列,我相信长度也会起作用。因此,即使这些字节相同,而长度不同,比较也是假的。一种简单的方法是将它们转换为字符串:

代码语言:javascript
复制
alter procedure [dbo].[spUpdateOrInsertNotification]
    @ContentJsonHash BINARY(32)
AS

DECLARE @NotificationId INT;
SET @NotificationId = (SELECT NotificationId
                       FROM dbo.tblNotifications n
                       WHERE convert(varchar(32), n.ContentJsonHash, 2) = convert(varchar(32), @ContentJsonHash, 2));

IF @NotificationId IS NOT NULL  
BEGIN
   -- Increment Count
END
ELSE
BEGIN
   -- Insert new row.
END
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47658412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档