@@ -963,10 +963,144 @@ BEGIN
963963 -- End collapsible synonyms section
964964 + N' INSERT INTO #markdown
965965 VALUES (CONCAT(CHAR(13), CHAR(10), ' ' </details>' ' ));
966- END;' -- End markdown for synonyms
966+ END;' ; -- End markdown for synonyms
967+
968+ /* **********************************************
969+ Generate markdown for user defined table types
970+ ***********************************************/
971+ -- Build table of contents
972+ SET @Sql = @Sql + N'
973+ IF EXISTS (SELECT 1 FROM [sys].[all_objects] WHERE [type] = ' ' TT' ' )
974+ BEGIN
975+ INSERT INTO #markdown (value)
976+ VALUES (CONCAT(CHAR(13), CHAR(10), ' ' ## User Defined Table Types' ' ))
977+ ,(CONCAT(CHAR(13), CHAR(10), ' ' <details><summary>Click to expand</summary>' ' , CHAR(13), CHAR(10)));
978+ ' +
979+
980+ + N' INSERT INTO #markdown (value)
981+ SELECT CONCAT(' ' * [' ' , SCHEMA_NAME([schema_id]), ' ' .' ' , [name], ' ' ](#' ' , REPLACE(LOWER(SCHEMA_NAME([schema_id])), ' ' ' ' , ' ' -' ' ), REPLACE(LOWER([name]), ' ' ' ' , ' ' -' ' ), ' ' )' ' )
982+ FROM [sys].[table_types]
983+ WHERE [is_user_defined] = 1
984+ ORDER BY OBJECT_SCHEMA_NAME([type_table_object_id]), [name] ASC;' +
985+
986+ -- Object details
987+ + N' DECLARE Obj_Cursor CURSOR
988+ LOCAL STATIC READ_ONLY FORWARD_ONLY
989+ FOR
990+ SELECT [type_table_object_id]
991+ FROM [sys].[table_types]
992+ WHERE [is_user_defined] = 1
993+ ORDER BY OBJECT_SCHEMA_NAME([type_table_object_id]), [name] ASC;
994+
995+ OPEN Obj_Cursor
996+ FETCH NEXT FROM Obj_Cursor INTO @objectid
997+ WHILE @@FETCH_STATUS = 0
998+ BEGIN
999+
1000+ INSERT INTO #markdown
1001+ SELECT CONCAT(CHAR(13), CHAR(10), ' ' ### ' ' , SCHEMA_NAME([schema_id]), ' ' .' ' , [name])
1002+ FROM [sys].[table_types]
1003+ WHERE [type_table_object_id] = @objectid;' +
1004+
1005+ -- Extended Properties
1006+ + N' INSERT INTO #markdown
1007+ SELECT CONCAT(CHAR(13), CHAR(10), CAST([ep].[value] AS VARCHAR(8000)))
1008+ FROM [sys].[all_objects] AS [o]
1009+ INNER JOIN [sys].[extended_properties] AS [ep] ON [o].[object_id] = [ep].[major_id]
1010+ WHERE [o].[object_id] = @objectid
1011+ AND [ep].[minor_id] = 0 --On the table
1012+ AND [ep].[name] = @ExtendedPropertyName;
1013+
1014+ INSERT INTO #markdown (value)
1015+ VALUES (' ' ' ' )
1016+ ,(CONCAT(' ' | Column | Type | Null | Default | ' ' , @ExtendedPropertyName COLLATE DATABASE_DEFAULT, ' ' |' ' ))
1017+ ,(' ' | --- | ---| --- | --- | --- |' ' );' +
1018+
1019+ -- Columns
1020+ + N' INSERT INTO #markdown
1021+ SELECT CONCAT(' ' | ' '
1022+ ,CASE
1023+ WHEN [ic].[object_id] IS NOT NULL
1024+ THEN ISNULL(CONCAT(' ' **' ' ,[c].[name],' ' **' ' ), ' ' N/A' ' )
1025+ ELSE ISNULL([c].[name], ' ' N/A' ' )
1026+ END
1027+ ,' ' | ' '
1028+ ,CONCAT(UPPER(TYPE_NAME([c].[user_type_id]))
1029+ ,CASE
1030+ WHEN TYPE_NAME([c].[user_type_id]) IN (N' ' decimal' ' ,N' ' numeric' ' )
1031+ THEN CONCAT(N' ' (' ' ,CAST([c].[precision] AS VARCHAR(5)), N' ' ,' ' ,CAST([c].[scale] AS varchar(5)), N' ' )' ' )
1032+ WHEN TYPE_NAME([c].[user_type_id]) IN (' ' varchar' ' , ' ' char' ' , ' ' varbinary' ' )
1033+ THEN CASE
1034+ WHEN [c].[max_length] = -1
1035+ THEN N' ' (MAX)' '
1036+ ELSE QUOTENAME(CAST([c].[max_length] AS VARCHAR(10)), ' ' (' ' )
1037+ END
1038+ WHEN TYPE_NAME([c].[user_type_id]) IN (N' ' time' ' ,N' ' datetime2' ' ,N' ' datetimeoffset' ' )
1039+ THEN QUOTENAME(CAST([c].[scale] AS VARCHAR(5)), ' ' (' ' )
1040+ WHEN TYPE_NAME([c].[user_type_id]) in (N' ' float' ' )
1041+ THEN CASE
1042+ WHEN [c].precision = 53
1043+ THEN N' ' ' '
1044+ ELSE CONCAT(N' ' (' ' ,CAST([c].[precision] AS VARCHAR(5)),N' ' )' ' )
1045+ END
1046+ WHEN TYPE_NAME([c].[user_type_id]) IN (N' ' int' ' ,N' ' bigint' ' ,N' ' smallint' ' ,N' ' tinyint' ' ,N' ' money' ' ,N' ' smallmoney' ' ,
1047+ N' ' real' ' ,N' ' datetime' ' ,N' ' smalldatetime' ' ,N' ' bit' ' ,N' ' image' ' ,N' ' text' ' ,N' ' uniqueidentifier' ' ,
1048+ N' ' date' ' ,N' ' ntext' ' ,N' ' sql_variant' ' ,N' ' hierarchyid' ' ,' ' geography' ' ,N' ' timestamp' ' ,N' ' xml' ' )
1049+ THEN N' ' ' '
1050+ WHEN TYPE_NAME([c].[user_type_id]) IN (N' ' nvarchar' ' ,N' ' nchar' ' , N' ' sysname' ' )
1051+ THEN CASE
1052+ WHEN [c].[max_length] = -1
1053+ THEN N' ' (MAX)' '
1054+ ELSE QUOTENAME(CAST([c].[max_length]/2 AS VARCHAR(10)), ' ' (' ' )
1055+ END
1056+ ELSE QUOTENAME(CAST([c].[max_length] AS VARCHAR(10)), ' ' (' ' )
1057+ END)
1058+ ,' ' | ' '
1059+ ,CASE [c].[is_nullable]
1060+ WHEN 1
1061+ THEN ' ' yes' '
1062+ ELSE ' ' no' '
1063+ END
1064+ ,' ' | ' '
1065+ ,OBJECT_DEFINITION([dc].[object_id])
1066+ ,' ' | ' '
1067+ ,CAST([ep].[value] AS VARCHAR(8000))
1068+ ,' ' |' ' )
1069+ FROM [sys].[table_types] AS [tt]
1070+ INNER JOIN [sys].[columns] AS [c] ON [tt].[type_table_object_id] = [c].[object_id]
1071+ LEFT JOIN [sys].[extended_properties] AS [ep] ON [tt].[type_table_object_id] = [ep].[major_id]
1072+ AND [ep].[minor_id] > 0
1073+ AND [ep].[minor_id] = [c].[column_id]
1074+ AND [ep].[class] = 1 --Object/col
1075+ -- AND [ep].[name] = @ExtendedPropertyName
1076+ LEFT JOIN [sys].[foreign_key_columns] AS [fk] ON [fk].[parent_object_id] = [c].[object_id]
1077+ AND [fk].[parent_column_id] = [c].[column_id]
1078+ LEFT JOIN [sys].[default_constraints] [dc] ON [dc].[parent_object_id] = [c].[object_id]
1079+ AND [dc].[parent_column_id] = [c].[column_id]
1080+ LEFT JOIN [sys].[indexes] AS [pk] ON [pk].[object_id] = [tt].[type_table_object_id]
1081+ AND [pk].[is_primary_key] = 1
1082+ LEFT JOIN [sys].[index_columns] AS [ic] ON [ic].[index_id] = [pk].[index_id]
1083+ AND [ic].[object_id] = [tt].[type_table_object_id]
1084+ AND [ic].[column_id] = [c].[column_id]
1085+ WHERE [tt].[type_table_object_id] = @objectid;' +
1086+
1087+ -- Back to top
1088+ + N' INSERT INTO #markdown
1089+ VALUES (CONCAT(CHAR(13), CHAR(10), ' ' [Back to top](#' ' , LOWER(@DatabaseName COLLATE DATABASE_DEFAULT), ' ' )' ' ))
1090+
1091+ FETCH NEXT FROM Obj_Cursor INTO @objectid;
1092+
1093+ END;
1094+ CLOSE Obj_Cursor;
1095+ DEALLOCATE Obj_Cursor;' +
1096+
1097+ -- End collapsible table section
1098+ + N' INSERT INTO #markdown
1099+ VALUES (CONCAT(CHAR(13), CHAR(10), ' ' </details>' ' ));
1100+ END;' ; -- End markdown for user defined table types
9671101
9681102 -- Attribution
969- + N' INSERT INTO #markdown
1103+ SET @Sql = @Sql + N' INSERT INTO #markdown
9701104 VALUES (CONCAT(CHAR(13), CHAR(10), ' ' ----' ' ))
9711105 ,(CONCAT(CHAR(13), CHAR(10), ' ' *Markdown generated by [sp_doc](https://expresssql.lowlydba.com/)' ' ))
9721106 ,(CONCAT(' ' at ' ' , SYSDATETIMEOFFSET(), ' ' .*' ' ));' ;
0 commit comments