Skip to content

Instantly share code, notes, and snippets.

@DataSic
Last active December 17, 2017 00:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save DataSic/69a513d9619f650058651c02d19e14b0 to your computer and use it in GitHub Desktop.
Save DataSic/69a513d9619f650058651c02d19e14b0 to your computer and use it in GitHub Desktop.
[SqlServer,Dev] Workload Generator
;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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment