Skip to content

Commit c18c22b

Browse files
committed
add user defined table types - resolves #134
1 parent abd0bb9 commit c18c22b

File tree

1 file changed

+136
-2
lines changed

1 file changed

+136
-2
lines changed

sp_doc.sql

Lines changed: 136 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)