Как получить все пользовательские типы данных в Sybase? - PullRequest
0 голосов
/ 22 июня 2011

Не могли бы вы помочь мне найти все пользовательские типы данных в базе данных sybase.

Спасибо!

Ответы [ 3 ]

2 голосов
/ 06 сентября 2011

Примечание: я понимаю, что об этом спросили некоторое время назад, но я наткнулся на него в поисках ответа, поэтому подумал, что я положу его здесь.

Все типы представлены в systypes, однако они не четко разграничены на пользовательские и системные типы. Кажется, что все типы систем имеют accessrule, установленный в NULL, и все мои типы пользователей имеют этот набор в 0, поэтому я использовал следующее:

SELECT * FROM systypes WHERE accessrule != NULL

Этого достаточно для того, что я делаю.

Подробнее о таблице systypes (и других связанных таблицах) вы можете узнать по адресу: http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.help.ase_15.0.tables/html/tables/tables69.htm

1 голос
/ 22 июня 2011

Поскольку sybase похож на SQL-сервер, использующий профилировщик, я получил этот запрос. Если это не работает, используйте инструмент, похожий на профилировщик для sybase, создайте пользовательский тип и проверьте системные таблицы, которые он обновляет.

SELECT
'Server[@Name=' + quotename(CAST(serverproperty(N'Servername') AS sysname),'''') + ']' + '/Database[@Name=' + quotename(db_name(),'''') + ']' + '/UserDefinedDataType[@Name=' + quotename(st.name,'''') + ' and @Schema=' + quotename(sst.name,'''') + ']' AS [Urn],
st.name AS [Name],
sst.name AS [Schema],
baset.name AS [SystemType],
CAST(CASE WHEN baset.name IN (N'nchar', N'nvarchar') AND st.max_length <> -1 THEN st.max_length/2 ELSE st.max_length END AS int) AS [Length],
CAST(st.precision AS int) AS [NumericPrecision],
CAST(st.scale AS int) AS [NumericScale],
st.is_nullable AS [Nullable]
FROM
sys.types AS st
INNER JOIN sys.schemas AS sst ON sst.schema_id = st.schema_id
LEFT OUTER JOIN sys.types AS baset ON baset.user_type_id = st.system_type_id and baset.user_type_id = baset.system_type_id
WHERE
(st.schema_id!=4 and st.system_type_id!=240 and st.user_type_id != st.system_type_id)
ORDER BY
[Schema] ASC,[Name] ASC
0 голосов
/ 30 октября 2015
select
     convert(char(15),a.name) [user type]
     ,(select convert(varchar(10),b.name) 
       from systypes b 
       where b.type=a.type  
       having b.usertype = min(b.usertype))
     + case
when (select b.name from systypes b 
      where b.type=a.type  
      having b.usertype = min(b.usertype) )='char'
then '('+convert(varchar(10),a.length)+')'
end
     ,a.prec
     ,a.scale
FROM systypes a
WHERE accessrule != NULL
go
...