I have a stored procedure:
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
It's supposed to check if the Hash already exists and if it does, increment the count for the row, otherwise insert the row. However, it never finds the Hash and the corresponding NotificationId. NotificationId is always null.
If I run it twice, passing it the same data (a C# array byte[32]). It never finds the same NotificationId and I end up with duplicate entries being put in.
e.g.
NotificationId | ContentJsonHash
9 0xB966C33517993003D789EDF78DA20C4C491617F8F42F76F48E572ACF8EDFAC2A
10 0xB966C33517993003D789EDF78DA20C4C491617F8F42F76F48E572ACF8EDFAC2A
Can I not do comparisons on Binary(n) fields like this WHERE n.ContentJsonHash = @ContentJsonhash ?
The C# code:
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();
}
}
I've also tried calling the stored procedure from SQL like this:
exec dbo.spUpdateOrInsertNotification 'foo', 'bar', 0,
'2017-12-05 15:23:41.207', '{}',
0xB966C33517993003D789EDF78DA20C4C491617F8F42F76F48E572ACF8EDFAC2A
Calling this twice returns 2 rows :(
I can do this, which works, hard coding the binary field I want to check
select *
from dbo.tblNotifications
where ContentJsonhash = 0xB966C33517993003D789EDF78DA20C4C491617F8F42F76F48E572ACF8EDFAC2A