我想从另一个HASHBYTES()的结果中聚合一个HASHBYTES()。类似于CHECKSUM_AGG()为校验和()所做的事情。
我已经找到了如何从表中每一行列创建一个散列:
SELECT
hashbytes('MD5', (
SELECT SPECIFIC_SCHEMA
,SPECIFIC_NAME
,ROUTINE_SCHEMA
,ROUTINE_NAME
,ROUTINE_TYPE
,ROUTINE_DEFINITION
FROM (
VALUES (NULL)
) foo(bar)
FOR XML auto
)) AS [Hash]
FROM INFORMATION_SCHEMA.ROUTINES AS MBT;
如何从返回的所有哈希行聚合到单个散列?
(是的,为了与其他数据库中的表(S)进行比较,我想将一个表缩小为一个散列)。
发布于 2022-07-22 00:09:51
您可以使用CONCAT
连接每一行的所有列,然后使用STRING_AGG
连接整个表,并散列结果。
我不能说,面对碰撞,这样的哈希会有多可靠。无论如何,MD5
是不推荐的,您应该使用SHA2_512
SELECT
HASHBYTES('SHA2_512',
STRING_AGG(CONCAT(
CAST(SPECIFIC_SCHEMA AS nvarchar(max)) -- at least one '(max)'
,SPECIFIC_NAME
,ROUTINE_SCHEMA
,ROUTINE_NAME
,ROUTINE_TYPE
,ROUTINE_DEFINITION
), '')) AS [hash]
FROM INFORMATION_SCHEMA.ROUTINES AS MBT;
为什么要使用INFORMATION_SCHEMA.ROUTINES
而不是sys.procedures
是另一个问题。这只是一个例子吗?
https://dba.stackexchange.com/questions/314717
复制相似问题