我有一个存储过程:
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和相应的NotificationId
。 NotificationId
始终为空。
如果我运行两次,则传递相同的数据(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
答案 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));
我觉得很快就没有注意到这一点:(