查询#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 中
假设我已经理解你的问题:将第一个查询作为第二个查询的子查询运行,然后拉出钥匙。
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)