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,

Примечание: мне нужна вся дата, включая милисекунды. Этот вопрос является продолжением вопроса ниже. Это может помочь вам понять корень проблемы.

Нужен эквивалент C# для функции SQL HashBytes ниже

1 ответ

Решение

Я получил решение. Я изменил логику HashBytes, как показано ниже, чтобы получить требуемый формат даты и времени, а также на стороне C#, я использую кодирование по умолчанию. Выберите хэш-байты ('MD5', конвертировать (varchar(200),(CONVERT(varchar(10), метка даты,126)+' '+CONVERT(VARCHAR(24), метка даты,114)),2)) из событий, где DateStamp ='2016-06-30 12:19:35.257961'

Другие вопросы по тегам