Workload Generator

Workload Generator

tSql gist to generate all possible queries based on foreign key constraints.

;WITH EdgeCTE
AS
(
SELECT parent_object_id Object1,
referenced_object_id Object2,
'[' + OBJECT_SCHEMA_NAME(FK.parent_object_id) + '].[' + OBJECT_NAME(FK.parent_object_id) + '] [T#L#1]' Table1,
'[' + OBJECT_SCHEMA_NAME(FK.referenced_object_id) + '].[' + OBJECT_NAME(FK.referenced_object_id) + '] [T#L#2]' Table2,
(SELECT CASE WHEN ROW_NUMBER() OVER(ORDER BY FKS.constraint_column_id) > 1 THEN ' AND ' ELSE '' END +
'[T#L#1].[' + C1.name + '] = ' +
'[T#L#2].[' + C2.name + ']' [text()]
FROM sys.foreign_key_columns FKS
INNER JOIN sys.columns C1 ON FKS.parent_object_id = C1.object_id AND FKS.parent_column_id = C1.column_id
INNER JOIN sys.columns C2 ON FKS.referenced_object_id = C2.object_id AND FKS.referenced_column_id = C2.column_id
WHERE FKS.parent_object_id = FK.parent_object_id
AND FKS.referenced_object_id = FK.referenced_object_id
ORDER BY FKS.constraint_column_id
FOR XML PATH('')) OnList,
COUNT(*) ColumnCnt
FROM sys.foreign_key_columns FK
GROUP BY FK.parent_object_id,
FK.referenced_object_id
),
RecursionCTE
AS
(
SELECT Object1,
Object2,
Table1,
Table2,
1 Level,
CAST(REPLACE(CONCAT(CHAR(13), CHAR(10), ' FROM ', Table1, CHAR(13), CHAR(10), ' INNER JOIN ', Table2, ' ON ', OnList), '#L#', '1') AS VARCHAR(MAX)) Stmt
FROM EdgeCTE
UNION ALL
SELECT E.Object1,
E.Object2,
E.Table1,
E.Table2,
Level + 1,
CAST(REPLACE(CONCAT(R.Stmt, CHAR(13), CHAR(10), ' INNER JOIN ', E.Table2, ' ON ', REPLACE(E.OnList, '#L#1', CAST(R.Level AS VARCHAR(10)) + '2')), '#L#', CAST(R.Level + 1 AS VARCHAR(10))) AS VARCHAR(MAX))
FROM EdgeCTE E
INNER JOIN RecursionCTE R ON R.Object2 = E.Object1
WHERE E.Object1 != E.Object2
)
SELECT Level,
CAST(CONCAT('SELECT COUNT(*) ', Stmt) AS XML),
'SELECT COUNT(*) ' + Stmt + CHAR(13) + CHAR(10) + CHAR(13) + CHAR(10)
FROM RecursionCTE
Jan Rokicki avatar
About Jan Rokicki
Sql Server Expert, Azure Solutions Architect and Machine Learning practitioner.