Tengo un nvarchar bastante grande que deseo pasar a la función HashBytes. me sale el error:SQL Server 2008 y HashBytes
"String or binary would be truncated. Cannot insert the value NULL into column 'colname', tbale 'table'; column does not allow nulls. UPDATE fails. The statement has been terminated."
Ser siempre ingenioso, descubrí que esto era debido a la función HashBytes tener un límite máximo de 8000 bytes. Además me searching mostró una 'solución' donde mi gran varchar se dividiría y hash por separado y luego se combina con esta función definida por el usuario:
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
que llamo con:
set @ReportDefinitionHash=convert(int,dbo.[udfLargeHashTable]('SHA1',@ReportDefinitionForLookup))
Dónde @ReportDefinitionHash es int, y @ReportDefinitionForLookup es el varchar
Pasar un simple carácter como 'prueba' produce una int diferente con mi UDF que una llamada normal a HashBytes produciría.
¿Algún consejo sobre este tema?
Básicamente, usted no desea agregar su cadena de hash y por lo que el tipo de retorno debe ser varbinary (20). Luego, intenta ejecutar lo siguiente: 'seleccionar hashbytes ('sha1', 'test'), hashbytes ('sha1', N'test ')' (te espera una gran sorpresa) :) –