You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何自动获取各表主键数据,为2500张表生成主键哈希键?

仅基于主键列批量生成哈希键的解决方案

核心思路

通过系统视图获取每张表的主键列名,再动态构造SQL语句,仅使用主键列生成哈希值(而非全表列)。系统视图仅能获取列名,但可通过列名构建查询获取实际数据,进而完成哈希计算。

步骤1:获取所有表的主键列

使用SQL Server系统视图查询每张表的主键列列表(适用于2017+版本,旧版本见下方替代方案):

SELECT 
    TABLE_NAME,
    STRING_AGG(COLUMN_NAME, ', ') AS PK_COLUMNS
FROM 
    INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
JOIN 
    INFORMATION_SCHEMA.KEY_COLUMN_USAGE c 
    ON tc.CONSTRAINT_NAME = c.CONSTRAINT_NAME
WHERE 
    tc.CONSTRAINT_TYPE = 'PRIMARY KEY'
GROUP BY 
    TABLE_NAME;

SQL Server 2016及以下版本替代写法:

SELECT 
    tc.TABLE_NAME,
    STUFF(
        (SELECT ', ' + COLUMN_NAME 
         FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE c 
         WHERE c.CONSTRAINT_NAME = tc.CONSTRAINT_NAME
         ORDER BY ORDINAL_POSITION
         FOR XML PATH('')), 
        1, 2, ''
    ) AS PK_COLUMNS
FROM 
    INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
WHERE 
    tc.CONSTRAINT_TYPE = 'PRIMARY KEY'
GROUP BY 
    tc.TABLE_NAME, tc.CONSTRAINT_NAME;

步骤2:动态生成哈希计算SQL

直接生成所有表的处理SQL,可批量执行或导出给Python脚本使用:

DECLARE @SQL NVARCHAR(MAX) = '';

SELECT 
    @SQL += 'SELECT A.*, HASHBYTES(''md5'', (SELECT A.' + REPLACE(PK_COLUMNS, ', ', ', A.') + ' FOR JSON PATH)) AS hash_key FROM [' + TABLE_NAME + '] A;' + CHAR(13) + CHAR(10)
FROM (
    -- 嵌入步骤1的查询语句
    SELECT 
        TABLE_NAME,
        STRING_AGG(COLUMN_NAME, ', ') AS PK_COLUMNS
    FROM 
        INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
    JOIN 
        INFORMATION_SCHEMA.KEY_COLUMN_USAGE c 
        ON tc.CONSTRAINT_NAME = c.CONSTRAINT_NAME
    WHERE 
        tc.CONSTRAINT_TYPE = 'PRIMARY KEY'
    GROUP BY 
        TABLE_NAME
) AS PK_TABLES;

-- 打印生成的SQL,确认无误后可执行
PRINT @SQL;
-- EXEC sp_executesql @SQL;

步骤3:结合Python脚本处理

若用Python批量执行并插入结果,可参考以下伪代码(使用pyodbc连接SQL Server):

import pyodbc

# 初始化数据库连接
conn_str = "DRIVER={ODBC Driver 17 for SQL Server};SERVER=你的服务器;DATABASE=你的库;UID=用户名;PWD=密码"
conn = pyodbc.connect(conn_str)
cursor = conn.cursor()

# 获取所有表的主键信息
cursor.execute("""
SELECT 
    TABLE_NAME,
    STRING_AGG(COLUMN_NAME, ', ') AS PK_COLUMNS
FROM 
    INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
JOIN 
    INFORMATION_SCHEMA.KEY_COLUMN_USAGE c 
    ON tc.CONSTRAINT_NAME = c.CONSTRAINT_NAME
WHERE 
    tc.CONSTRAINT_TYPE = 'PRIMARY KEY'
GROUP BY 
    TABLE_NAME
""")
tables = cursor.fetchall()

# 遍历每张表生成哈希并处理插入
for table_name, pk_cols in tables:
    # 构造仅用主键列生成哈希的SQL
    query_sql = f"""
    SELECT 
        *,
        HASHBYTES('md5', (SELECT {pk_cols} FOR JSON PATH)) AS hash_key
    FROM [{table_name}]
    """
    cursor.execute(query_sql)
    result_rows = cursor.fetchall()
    
    # 此处添加你的插入逻辑,例如插入到目标表
    # insert_sql = "INSERT INTO 目标表 (...) VALUES (...)"
    # for row in result_rows:
    #     cursor.execute(insert_sql, row)

conn.commit()
conn.close()

哈希生成方式说明

  • FOR JSON PATH序列化:自动处理不同数据类型的格式问题(包括NULL值),生成的JSON字符串稳定,哈希结果可靠,推荐使用。
  • CONCAT_WS拼接方式:若追求更高性能,可改用该方式,但需手动处理数据类型转换和NULL值(例如ISNULL(CAST(PK列 AS NVARCHAR(MAX)), '')),需注意格式一致性,避免因序列化差异导致哈希不一致。

内容的提问来源于stack exchange,提问作者hashdif

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 23:53:19