получить столбцы таблицы Temp в sybase - PullRequest
5 голосов
/ 09 мая 2011

Есть ли способ получить список столбцов временной таблицы в sybase?Предположим, у меня есть таблица с именем # mytable

select count (*) from  tempdb..#mytable

, возвращаем 145, чтобы сказать, что в этой таблице 145 строк.Я попробовал следующее (с некоторыми вариациями)

select so.name from tempdb..syscolumns sc inner join tempdb..sysobjects so on sc.id = so.id where so.name = '#mytable'

также попытался

select so.name from tempdb..syscolumns sc inner join tempdb..sysobjects so on sc.id = so.id where so.name = 'tempdb..#mytable'

оба вернулись с пустым результатом.другие примитивы для получения имен столбцов временной таблицы в sybase?

Ответы [ 3 ]

2 голосов
/ 14 мая 2011

Я прошу прощения, но у меня нет Sybase, чтобы примерить это.Тем не менее, я могу дать вам то, что я считаю ответом, но вам может потребоваться немало усилий, чтобы получить правильный синтаксис.По сути, согласно документации вы можете использовать команду sp_help в вашей временной таблице, если вы делаете это из tempdb.Вот цитата из Sybase:

Системные процедуры, такие как sp_help, работают с временными таблицами, только если вы вызываете их из tempdb.

Ссылка

Вот как можно использовать команду sp_help:

http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.help.ase_15.0.sprocs/html/sprocs/sprocs118.htm

Причина, по которой команда OBJECT_ID(tempdb..#mytable) не сработала, заключается в том, что имя таблицы не существует вэтот стол.Причина в том, что Sybase гарантирует, что все временные таблицы являются уникальными.Для этого он берет имя временной таблицы (включая знак фунта) и усекает его до 13 символов, добавляет подчеркивание, чтобы сделать его 13 символами (если оно было коротким), и добавляет 17-значный идентификатор сеанса кконец имени таблицы.Таким образом, вы можете иметь временную таблицу с именем #mytable, а другой пользователь (или даже вы в другом сеансе) может иметь точно такое же имя для временной таблицы, не вызывая конфликта.Если бы вы выяснили свой идентификатор сессии, вы, вероятно, могли бы построить имя вашей временной таблицы.Если вы построили имя временной таблицы, вы можете присвоить его переменной (скажем, @newTableName) и использовать метод SELECT name FROM tempdb..syscolumns WHERE id = OBJECT_ID(@newTableName) для получения столбцов вашей временной таблицы.

0 голосов
/ 08 марта 2017

Хорошо, я знаю, очень старая тема - но я не мог найти достаточного ответа где-либо еще, поэтому я исследовал себя с ответом 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.
0 голосов
/ 31 октября 2011

Попробуйте это

select sc.id, sc.number, sc.name from tempdb..syscolumns sc inner join tempdb..sysobjects so on sc.id = so.id where so.name like '%mytable%'

Без # или любой другой временной .. # mytable ссылки в вашем выборе.

...