Hashbytes Вычисляемый столбец не может быть сохранен, потому что столбец недетерминирован
Я пытаюсь datetime
использование колонки HashBytes
alter table dbo.Events
add HashKey AS hashbytes('MD5', cast(convert(varchar(200), format(datestamp,'yyyy-MM-dd HH:mm:ss.ffffff')) as varbinary)) persisted
но поскольку это недетерминировано, я получаю эту ошибку:
Вычисляемый столбец не может быть сохранен, потому что столбец недетерминирован.
Мне удалось сделать это, не указав формат, как показано ниже
alter table dbo.PolicyEventsFromQueue
add HashKey AS hashbytes('MD5', cast( datestamp as varbinary)) persisted
Но в SQL Server, когда я вижу результаты в формате и без формата, я получаю разные результаты для одного и того же значения поля:
Select
convert(varchar(200), hashbytes('MD5', cast(convert(varchar(200), format(datestamp, 'yyyy-MM-dd HH:mm:ss.ffffff')) as varbinary)), 1)
From
Events
Where
DateStamp ='2016-06-30 12:19:35.257961'
Результат:
0xBE06A33FF10644A6D3B38EA134DDB97A
Второй запрос:
select
hashbytes('MD5', cast('2016-06-30 12:19:35.257961' as varbinary))
Результат:
0xBE06A33FF10644A6D3B38EA134DDB97A
Третий запрос:
Select
convert(varchar(200), hashbytes('MD5', cast(DateStamp as varbinary)), 1)
From
Events
Where
DateStamp = '2016-06-30 12:19:35.257961'
Результат:
0x3CB5C26B23EB4422515764686DFCAB82
Исходя из вышеизложенного, я понял, что SQL Server преобразует метку даты в другой формат, а затем хэширует.
Но когда я получаю эквивалентное значение C# для той же даты ("2016-06-30 12:19:35.257961") с использованием функции ниже, оно не совпадает со значением хеша (0x3CB5C26B23EB4422515764686DFCAB82
).
public static byte[] GetMD5Hash(string input)
{
System.Security.Cryptography.MD5CryptoServiceProvider x = new System.Security.Cryptography.MD5CryptoServiceProvider();
byte[] bs = System.Text.Encoding.Unicode.GetBytes(input);
bs = x.ComputeHash(bs);
return bs;
}
Кто-нибудь может помочь, чтобы соответствовать формату даты и времени точно так же, как это требуется в SQL Server и C#, чтобы заставить его работать с HashBytes
,
Примечание: мне нужна вся дата, включая милисекунды. Этот вопрос является продолжением вопроса ниже. Это может помочь вам понять корень проблемы.
1 ответ
Я получил решение. Я изменил логику HashBytes, как показано ниже, чтобы получить требуемый формат даты и времени, а также на стороне C#, я использую кодирование по умолчанию. Выберите хэш-байты ('MD5', конвертировать (varchar(200),(CONVERT(varchar(10), метка даты,126)+' '+CONVERT(VARCHAR(24), метка даты,114)),2)) из событий, где DateStamp ='2016-06-30 12:19:35.257961'