Last active
December 17, 2017 00:47
-
-
Save DataSic/69a513d9619f650058651c02d19e14b0 to your computer and use it in GitHub Desktop.
[SqlServer,Dev] Workload Generator
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
;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