У меня довольно большой nvarchar, который я хочу передать функции HashBytes. Я получаю сообщение об ошибке:
"Строка или двоичная информация будет усечена. Невозможно вставить значение NULL в column 'colname', tbale 'table'; столбец не допускает нулей. ОБНОВИТЬ выходит из строя. Заявление было прекращается".
Будучи всегда изобретательным, я обнаружил, что это связано с тем, что функция HashBytes имеет максимальный предел в 8000 байт. Дальнейший поиск показал мне "решение", где мой большой varchar будет разделен и хэширован отдельно, а затем в сочетании с этой пользовательской функцией:
function [dbo].[udfLargeHashTable] (@algorithm nvarchar(4), @InputDataString varchar(MAX))
RETURNS varbinary(MAX)
AS
BEGIN
DECLARE
@Index int,
@InputDataLength int,
@ReturnSum varbinary(max),
@InputData varbinary(max)
SET @ReturnSum = 0
SET @Index = 1
SET @InputData = convert(binary,@InputDataString)
SET @InputDataLength = DATALENGTH(@InputData)
WHILE @Index <= @InputDataLength
BEGIN
SET @ReturnSum = @ReturnSum + HASHBYTES(@algorithm, SUBSTRING(@InputData, @Index, 8000))
SET @Index = @Index + 8000
END
RETURN @ReturnSum
END
с которым я звоню:
set @ReportDefinitionHash=convert(int,dbo.[udfLargeHashTable]('SHA1',@ReportDefinitionForLookup))
Где @ReportDefinitionHash - int, а @ReportDefinitionForLookup - это varchar
Передача простого char как "test" создает другой int с моим UDF, чем обычный вызов HashBytes.
Любые советы по этой проблеме?