合并这 2 个将主键作为变量插入的 SQL 查询?

问题描述 投票:0回答:1

查询#1:

SELECT
    (SELECT COLUMN_NAME
     FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
     WHERE OBJECTPROPERTY(OBJECT_ID(CONSTRAINT_SCHEMA + '.' + QUOTENAME(CONSTRAINT_NAME)), 'IsPrimaryKey') = 1
       AND TABLE_NAME = 'TB_CI_DZJ_C2_RLT_SRC_DIM' 
       AND TABLE_SCHEMA = 'dbo') AS pk

查询#2:

SELECT
    TB_CI_DZJ_C2_RLT_SRC_DIM.*, hash_key
FROM
    TB_CI_DZJ_C2_RLT_SRC_DIM
CROSS APPLY
    (VALUES (HASHBYTES('md5', CONCAT('', DW_RLT_SRC_ID)))) hk (hash_key)

第一个查询标识我正在使用的任何表的主键。我要换了

AND TABLE_NAME = 'TB_CI_DZJ_C2_RLT_SRC_DIM'  
AND TABLE_SCHEMA = 'dbo'

有一个占位符贯穿我的Python代码中的所有表名。

第二个查询根据每个表的主键创建一个

hash_key
值,该值显然对于每个表来说都是不同的。这就是为什么我想自动化每个表使用哪些主键列,然后根据每个表使用的主键创建一个 hash_key 。然后,该数据将被插入到临时表中。

这就是我想要的逻辑。我陷入了如何组合这两个查询的困境,以便将

pk
用作存储该表的主键的变量,然后我想使用
pk
代替
DW_RLT_SRC_ID
,这是最难的编码的主键。我不知道如何组合它们,我尝试过 UNION 但它不起作用。

我的数据如下所示:

DW_RLT_SRC_ID RLT_SRC_CDE
1 CIS
2 闪电网络

运行查询 #2 后,这就是它的样子,这就是我想要插入到临时表中的内容:

DW_RLT_SRC_ID RLT_SRC_CDE 哈希键
1 CIS ÊB8 ¹# ÌP ou
2 闪电网络 È r L/co Ì ,

我试图将主键存储为查询#1 中的变量,这样我就可以使用查询#2 中的主键,而不是对查询#2 中的主键进行硬编码。这样我也可以将它用于其他表。现在我的代码仅适用于 1 个表,但如果我想对所有 2500 个表自动执行此过程,我需要找到每个表的主键(在查询 #1 中完成),然后在查询 # 中插入该主键2.

我想做这样的事情:

SELECT
    TB_CI_DZJ_C2_RLT_SRC_DIM.*, hash_key
FROM
    TB_CI_DZJ_C2_RLT_SRC_DIM
CROSS APPLY
    (VALUES (HASHBYTES('md5', CONCAT('', pk)))) hk (hash_key)

其中主键取自查询 #1 并插入到查询 #2 中

sql sql-server
1个回答
0
投票

假设我已经理解你的问题:将第一个查询作为第二个查询的子查询运行,然后拉出钥匙。

SELECT
    TB_CI_DZJ_C2_RLT_SRC_DIM.*, hash_key
FROM
    TB_CI_DZJ_C2_RLT_SRC_DIM
OUTER APPLY (
    SELECT COLUMN_NAME
    FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
    WHERE OBJECTPROPERTY(OBJECT_ID(CONSTRAINT_SCHEMA + '.' + QUOTENAME(CONSTRAINT_NAME)), 'IsPrimaryKey') = 1
       AND TABLE_NAME = 'TB_CI_DZJ_C2_RLT_SRC_DIM' 
       AND TABLE_SCHEMA = 'dbo'
) AS pk
CROSS APPLY
    (VALUES (HASHBYTES('md5', CONCAT('', pk.COLUMN_NAME)))) hk (hash_key)

可以将其添加到存储过程中,然后传入架构和表。

DECLARE @tableName sysname = 'TB_CI_DZJ_C2_RLT_SRC_DIM'
DECLARE @tableSchema nvarchar(128) = 'dbo'

DECLARE @sql nvarchar(max) ='SELECT
    target.*, hash_key
FROM
    '+QUOTENAME(@tableSchema)+'.'+QUOTENAME(@tableName)+' AS target
OUTER APPLY(
    SELECT COLUMN_NAME
     FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
     WHERE OBJECTPROPERTY(OBJECT_ID(CONSTRAINT_SCHEMA + ''.'' + QUOTENAME(CONSTRAINT_NAME)), ''IsPrimaryKey'') = 1
       AND TABLE_NAME = '''+@tableName+''' 
       AND TABLE_SCHEMA = '''+@tableSchema+'''
) pk
CROSS APPLY
    (VALUES (HASHBYTES(''md5'', CONCAT('''', pk.COLUMN_NAME)))) hk (hash_key)'
    
    exec(@sql)
© www.soinside.com 2019 - 2024. All rights reserved.