If you have a bunch of User-Defined Data Types in your databases and you would like to get a list of them then you can run the following query
On SQL Server 2000 and up
select * from systypes
where xusertype > 256
or
On SQL Server 2005 and up
SELECT * FROM sys.Types
WHERE is_user_defined = 1
Let’s take a look how this works by adding a couple of User-Defined Data Types. we will add a birthday type which will be a datetime (on SQL Server 2008 it should be a date) and a StateCode which is a char(2)
USE master
EXEC sp_addtype birthday, datetime, 'NULL'
Go
EXEC sp_addtype StateCode,'Char(2)' , 'NULL'
Go
Now we can create a table which uses these two types
create table TestType (Birthday birthday,State StateCode)
Insert some data
insert TestType values('19100101','NY')
insert TestType values('19800101','CA')
And we can query the data as usual
select * from TestType
To see what data type is actually used to store the data we can run the following query
select column_name,data_type,character_maximum_length
from information_schema.columns
where table_name = 'TestType'
output
----------------- column_name data_type character_maximum_length Birthday datetime State char 2
As you can see datetime and char(2) are used
We can also use the SysTypes (SQL Server 2000 and up) and Sys.Types system tables/catalog views
SELECT s.name,s2.name,s2.length
FROM SysTypes s
join SysTypes s2 on s.xtype = s2.xtype
WHERE s.xusertype > 256
and s2.xusertype <= 256
output
---------------------- name name length birthday datetime 8 StateCode char 8000
SELECT s.name,s2.name,s2.max_length
FROM Sys.Types s
join Sys.Types s2 on s2.user_type_id = s.system_type_id
WHERE s.is_user_defined = 1
and s2.is_user_defined = 0
output
---------------------- name name length birthday datetime 8 StateCode char 8000
How do you drop a User-Defined Data Type?
Here is how you do it. Run the following query
USE master
EXEC sp_droptype 'birthday'
GO
As you can see you get the following error
Server: Msg 15180, Level 16, State 1, Procedure sp_droptype, Line 32
Cannot drop. The data type is being used.
So we first need to drop the table that is using this data type
drop table TestType
Now we can try again
USE master
EXEC sp_droptype 'StateCode'
USE master
EXEC sp_droptype 'birthday'
And that drops the User-Defined Data Types we created
*** If you have a SQL related question try our Microsoft SQL Server Programming forum or our Microsoft SQL Server Admin forum