Хорошо, я знаю, очень старая тема - но я не мог найти достаточного ответа где-либо еще, поэтому я исследовал себя с ответом IAmTimCorey в качестве отправной точки. Это дало следующий результат:
SELECT sc.colid,
Substring(sc.NAME, 1, 40) 'column name',
Substring(st.NAME, 1, 40) 'type',
sc.length,
sc.prec,
sc.status,
( CASE
WHEN ( sc.status & 8 ) != 0 THEN 'Y'
ELSE 'N'
END ) AS 'nullable',
( CASE
WHEN ( sc.status & 128 ) != 0 THEN 'Y'
ELSE 'N'
END ) AS 'identity'
FROM tempdb..syscolumns sc
INNER JOIN tempdb..sysobjects so
ON sc.id = so.id
INNER JOIN systypes st
ON st.type = sc.type
AND st.usertype = sc.usertype
WHERE so.NAME = 'test'
ORDER BY sc.colid
Пример:
1> create table tempdb..test(id numeric (15,0) identity, string varchar(40), num numeric(15,0) not null, dt datetime, flt float)
2> go
1> select sc.colid, substring(sc.name, 1, 40) 'column name', substring(st.name, 1, 40) 'type', sc.length, sc.prec, sc.status, (case when (sc.status & 8) != 0 then 'Y' else 'N' end) as nullable, (case when (sc.status & 128) != 0 then 'Y' else 'N' end) as ident from tempdb..syscolumns sc inner join tempdb..sysobjects so on sc.id = so.id inner join systypes st on st.type = sc.type and st.usertype = sc.usertype where so.name = 'test' order by sc.colid
2> go
colid column name type length prec status nullable ident
------ ---------------------------------------- ---------------------------------------- ----------- ---- ------ -------- -----
1 id numeric 8 15 128 N Y
2 string varchar 40 NULL 0 N N
3 num numeric 8 15 0 N N
4 dt datetime 8 NULL 0 N N
5 flt float 8 NULL 0 N N
(5 rows affected)
1>
Примечания:
- Обнаружение обнуляемых столбцов было получено из документации Sybase, но по неизвестным мне причинам бит 3 статуса в tempdb..syscolumns не изменяется соответствующим образом, см. Столбец num в моем примере. Вот почему я все равно добавил статус столбца. Для идентичности (бит 7) все работает как положено. Любое объяснение будет очень цениться.
- При использовании isql начните с достаточной ширины (например, -w160)
- Ширина столбца по умолчанию для syscolumns.name и systypes.name довольно велика, поэтому я использую подстроку (....). Отрегулируйте количество копируемых символов (последний параметр substring ()), если имена столбцов не подходят.
- Опуская «tempdb ..» в именах таблиц, этот запрос также работает для обычных таблиц, не являющихся tempdb, в случае, если запрос предпочтительнее использования команд sp_xxx.