2011-05-09 2 views
5

sybase에서 임시 테이블의 열 목록을 가져 오는 방법이 있습니까? 내가이 테이블의 145 개 행이 말을sybase에 Temp 테이블의 열을 가져옵니다.

select count (*) from tempdb..#mytable 

#mytable 수익 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에서 임시 테이블의 열 이름을 가져 오는 다른 기본 요소는 무엇입니까?

+0

OBJECT_ID ('tempdb .. # mytable')로 검색을 시도 했습니까? –

+0

@Andriy - OP에서 "Sybase에서 아무것도 반환하지 않습니다"라는 이유로 'SELECT name FROM tempdb..syscolumns WHERE id = OBJECT_ID ('tempdb .. # mytable ')'와 같은 대답을 삭제했습니다. –

답변

2

죄송하지만 Sybase에서이 문제를 해결할 필요가 없습니다. 그러나 나는 대답을 줄 수는 있지만 구문을 올바로 적용하려면 약간의 노력이 필요할 수 있습니다. 기본적으로, 설명서에 따르면 tempdb에서 수행하는 한 임시 테이블에서 sp_help 명령을 사용할 수 있습니다.

sp_help와 같은 시스템 프로시 저는 tempdb에서 호출 할 때만 임시 테이블에서 작동합니다. 여기

Reference

당신이 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 자리 세션 ID를 테이블 이름의 끝. 이 방법으로 #mytable이라는 임시 테이블을 만들 수 있고 다른 사용자 (또는 다른 세션의 사용자도)는 충돌을 일으키지 않고 임시 테이블에 대해 똑같은 이름을 가질 수 있습니다. 세션 ID를 알아 내면 임시 테이블 이름을 만들 수 있습니다. 임시 테이블 이름을 작성한 경우이를 변수 (예 : @newTableName)에 할당하고 SELECT name FROM tempdb..syscolumns WHERE id = OBJECT_ID(@newTableName) 메소드를 사용하여 임시 테이블 열을 검색 할 수 있습니다.

-1

는 # 또는 다른 온도 사용자의 선택에 .. MYTABLE 관계없이이

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

을보십시오.

+0

왜이 문제가 해결됩니까? ? – Nightfirecat

0

좋아요, 아주 오래된 주제입니다.하지만 다른 곳에서는 충분한 답변을 찾을 수 없으므로 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> 

비고 : 나에게 알 수없는

    널 (NULL) 컬럼의 검출은 Sybase 문서에서 파생 된
  • 하지만 이유는 3 비트 이것은 다음과 같은 결과를 주었다 tempdb..syscolumns의 상태는 이에 따라 변경되지 않습니다 (예제의 열 num 참조). 그래서 어쨌든 열 상태를 추가했습니다. 신원 (비트 7)의 경우 예상대로 작동합니다. 어떤 설명이라도 대단히 감사하겠습니다.
  • isql을 사용할 때 충분한 너비 (예 : -w160)로 시작하십시오.
  • syscolumns.name 및 systypes.name의 기본 열 너비가 매우 커서 따라서 하위 문자열 (....)을 사용하고 있습니다. 열 이름이 맞지 않으면 복사 된 문자 수 (하위 문자열()의 마지막 매개 변수)를 조정하십시오.
  • 테이블 이름에서 'tempdb ..'을 생략하면 sp_xxx 명령을 사용하는 것보다 쿼리를 사용하는 것이 바람직한 경우에이 쿼리는 일반 tempdb가 아닌 테이블에서도 작동합니다.
관련 문제