2011-05-09 24 views
5

Sybase'de geçici bir tablonun sütunlarının listesini almanın bir yolu var mı? Ben bu tabloda 145 satır olduğunda söylemeksybase'de bir Temp tablosunun sütunlarını alın

select count (*) from tempdb..#mytable 

#mytable dönüş 145 olarak adlandırılan bir tablo olduğunu varsayalım. Ben

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

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

de geri boş sonuçla geldi denedik (birkaç varyasyon ile) Aşağıdaki çalıştı.

herhangi bir fikir? sybase'de bir temp tablosunun sütun isimlerini almak için diğer tüm primitifler?

+0

OBJECT_ID ('tempdb .. # mytable') ile arama yapmayı denediniz mi? –

+0

@Andriy - Ben SELECT ismi FROM tempdb..syscolumns NEREDE = OBJECT_ID ('tempdb .. # mytable') 'öneren cevabımı sildim çünkü OP" Sybase'de hiçbir şey döndürmedi " –

cevap

2

Özür dilerim ama Sybase'i denemem. Bununla birlikte, cevabın ne olduğuna inandığımı size verebilirim ama sözdizimini doğrulamak için biraz ayak işi alabilir. Temel olarak, belgelere göre, tempdb'dan yaptığınız sürece geçici tablonuzdaki sp_help komutunu kullanabilirsiniz. Burada, Sybase:

'dan alıntı şudur: sp_help gibi sistem işlemleri geçici tablolarda yalnızca tempdb'den çağırırsanız çalışır. İşte

Reference

Eğer sp_help komutu şekli şöyledir:

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

OBJECT_ID(tempdb..#mytable) komut bu tablo adını söz konusu tabloda yok çünkü işe yaramadı nedeni . Nedeni, Sybase'in tüm sıcaklık tablolarının benzersiz olmasını sağlamasıdır. Bunu yapmak için, temp tablosu adını (pound işareti dahil) alır ve 13 karaktere böler, 13 karakter (altta olduğu durumda) yapmak için alt çizgileri ekler ve 17 basamaklı bir oturum kimliği ekler. tablo adının sonu. Bu şekilde #mytable ve başka bir kullanıcı (veya başka bir oturumda bile) adında bir templak tablonuzda çakışmalara neden olmadan geçici bir tablo için aynı ada sahip olabilirsiniz. Oturum kimliğinizi anladıysanız, muhtemelen geçici tablo adınızı da oluşturabilirsiniz. Geçici tablo adını oluşturduysanız, bir değişkene atayabilir (örneğin, @newTableName) ve temp tablosu sütunlarınızı almak için SELECT name FROM tempdb..syscolumns WHERE id = OBJECT_ID(@newTableName) yöntemini kullanabilirsiniz.

-1

# veya başka herhangi sıcaklığında senin seçme içinde .. # myTable referans olmadan bu

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%' 

deneyin.

+0

Ve neden bu sorunu çözüyor ? – Nightfirecat

0

Tamam, çok eski bir konu - ama başka bir yerde yeterli bir cevap bulamadım, bu yüzden kendimi IAmTimCorey'in başlangıç ​​noktası olarak yanıtla araştırdım.

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 

Örnek:

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> 

Açıklamalar: -anlayamadığım

    null sütun tespit Sybase belgelerinde elde edilmiş
  • ancak nedenleri bit 3 Bu, aşağıdaki sonuçları verdi tempdb..syscolumns'taki durumun durumu buna göre değişmez, örneğimde sütun no. Bu yüzden yine de sütun durumu ekledim. Kimlik için (bit 7) işler beklendiği gibi çalışır. Herhangi bir açıklama çok takdir edilecektir.
  • isql kullanırken, yeterli genişlikte (ör. -w160)
  • ile başlayın. Syscolumns.name ve systypes.name için varsayılan sütun genişliği oldukça büyüktür, bu yüzden alt dizini kullanıyorum (....). Sütun adlarınız uymuyorsa kopyalanan karakterlerin sayısını (substring() 'nin son parametresi) ayarlayın.
  • Tablo temasından 'tempdb ..' ifadesini atlayarak, sp_xxx komutları kullanılarak sorgulamanın tercih edilmesi durumunda normal olmayan tempdb tabloları için bu sorgu da çalışır.
İlgili konular