SQL二进制(n)列

时间:2017-12-05 16:33:58

标签: sql-server-2012

我有一个存储过程:

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是否已经存在,如果确实存在,则增加该行的计数,否则插入该行。但是,它永远不会找到Hash和相应的NotificationIdNotificationId始终为空。

如果我运行两次,则传递相同的数据(C#数组byte[32])。它永远不会找到相同的NotificationId,我最终会输入重复的条目。

e.g。

NotificationId | ContentJsonHash
9                0xB966C33517993003D789EDF78DA20C4C491617F8F42F76F48E572ACF8EDFAC2A
10               0xB966C33517993003D789EDF78DA20C4C491617F8F42F76F48E572ACF8EDFAC2A

我是否可以对二进制(n)字段进行比较,例如WHERE n.ContentJsonHash = @ContentJsonhash

C#代码:

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调用存储过程:

exec dbo.spUpdateOrInsertNotification 'foo', 'bar',  0, 
                                      '2017-12-05 15:23:41.207', '{}',
                              0xB966C33517993003D789EDF78DA20C4C491617F8F42F76F48E572ACF8EDFAC2A

调用两次返回2行:(

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

select *
from dbo.tblNotifications
where ContentJsonhash = 0xB966C33517993003D789EDF78DA20C4C491617F8F42F76F48E572ACF8EDFAC2A

2 个答案:

答案 0 :(得分:1)

二进制比较可能很棘手。如果您使用的是真正的二进制列,我相信长度也会发挥作用。因此,即使这些字节相同,并且长度不同,比较也将是错误的。一种简单的方法是将这些转换为字符串:

UDP.payload_guess = [({}, NetflowHeader)] 
pkts = sniff(iface=INTERFACE)

答案 1 :(得分:0)

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

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

应该是

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

我觉得很快就没有注意到这一点:(