IF CONVERT(varbinary(max),@actual)
<> CONVERT(varbinary(max),@expected)
BEGIN
DECLARE @diffPos int = 1;
DECLARE @compareLength int =
CASE
WHEN DATALENGTH(@actual) > DATALENGTH(@expected)
THEN DATALENGTH(@actual) / 2
ELSE DATALENGTH(@expected) / 2
END;
WHILE @diffPos <= @compareLength
BEGIN
IF CONVERT(varbinary(max), SUBSTRING(@actual, @diffPos, 1))
<> CONVERT(varbinary(max), SUBSTRING(@expected, @diffPos, 1))
BREAK;
SET @diffPos += 1;
END;
SELECT
@@SERVERNAME AS serverName,
DB_NAME() AS databaseName,
@old AS objectName,
DATALENGTH(@actual) AS actualBytes,
DATALENGTH(@expected) AS expectedBytes,
@diffPos AS firstDifference,
UNICODE(SUBSTRING(@actual, @diffPos, 1)) AS actualCharacterCode,
UNICODE(SUBSTRING(@expected, @diffPos, 1)) AS expectedCharacterCode,
SUBSTRING(
@actual,
CASE WHEN @diffPos > 100 THEN @diffPos - 100 ELSE 1 END,
400
) AS actualFragment,
SUBSTRING(
@expected,
CASE WHEN @diffPos > 100 THEN @diffPos - 100 ELSE 1 END,
400
) AS expectedFragment;
SET @message =
N'Definition differs from supplied snapshot: ' + @old;
THROW 51916, @message, 1;
END;