Существуют различные типы пользовательских типов: пользовательские таблицы (UDTT), пользовательские типы (UDT; сложные типы, реализованные с помощью SQLCLR) и пользовательские типы данных (UDDT; главным образом, синонимы существующей системы). типов, но с учетом размера / точности и NULL
/ NOT NULL
).
Вам не нужно беспокоиться о UDTT, поскольку они не могут быть столбцами в таблицах.
Возможно, вы можетеНе работайте с UDT, по крайней мере, сейчас, так как это добавляет много сложности, так как вам также необходимо скопировать сборку.
Существует один основной вид системного каталога: sys.types
. Следующее должно дать вам большинство, если не все, что вам нужно. collation_name
, по-видимому, не годится для использования ни при тестировании простого CREATE TYPE
в качестве теста, ни в документации.
SELECT N'CREATE TYPE ' + QUOTENAME(sch.[name])
+ N'.' + QUOTENAME(typ.[name])
+ N' FROM ' + styp.[name]
+ CASE
WHEN typ.[system_type_id] IN
(41, 42, 43, 106, 108, 165, 167, 173, 175, 231, 239)
THEN N'('
+ CASE
WHEN typ.[max_length] = -1 -- for: VARCHAR, NVARCHAR, VARBINARY
THEN N'MAX'
WHEN typ.[system_type_id] IN (165, 167, 173, 175)
-- VARBINARY, VARCHAR, BINARY, CHAR
THEN CONVERT(NVARCHAR(5), typ.[max_length])
WHEN typ.[system_type_id] IN (231, 239) -- NVARCHAR, NCHAR
THEN CONVERT(NVARCHAR(5), (typ.[max_length] / 2))
WHEN typ.[system_type_id] IN (41, 42, 43)
-- TIME, DATETIME2, DATETIMEOFFSET
THEN CONVERT(NVARCHAR(5), typ.[scale])
WHEN typ.[system_type_id] IN (106, 108) -- DECIMAL, NUMERIC
THEN CONVERT(NVARCHAR(5), typ.[precision])
+ N', ' + CONVERT(NVARCHAR(5), typ.[scale])
END
+ N')'
ELSE N''
END
+ CASE typ.[is_nullable] WHEN 1 THEN N' NULL' ELSE ' NOT NULL' END
+ N';'
FROM sys.types typ
INNER JOIN sys.schemas sch
ON sch.[schema_id] = typ.[schema_id]
INNER JOIN sys.types styp
ON styp.[user_type_id] = typ.[system_type_id]
WHERE typ.[is_user_defined] = 1
AND typ.[is_assembly_type] = 0
AND typ.[is_table_type] = 0;
Правила
!! Они давно устарели и не должны использоваться !!
Документация для CREATE RULE
Правила можно найти в: sys.sql_modules
(который включает в себя оператор CREATE
в поле [definition]
)
Вам необходимо будет отдельно циклически проходить по sys.types
и, для любых пользовательских типов, где rule_object_id <> 0
, выполнить EXEC sp_bindrule N'@rulename', N'@objectname';
.
По умолчанию
!! Они давно устарели и не должны использоваться !!
Документация для CREATE DEFAULT
Значения по умолчанию можно найти в: sys.sql_modules
(который включает в себя оператор CREATE
в поле [definition]
)
Вам необходимо будет отдельно циклически проходить по sys.types
и, для любых пользовательских типов, где default_object_id <> 0
, выполнить EXEC sp_bindefault N'@defaultname', N'@objectname';
.