2011-05-09 10 views
5

¿Hay alguna forma de obtener la lista de columnas de una tabla temporal en sybase? supongamos que tengo una tabla llamada #mytableobtener las columnas de una tabla Temp en sybase

select count (*) from tempdb..#mytable 

de retorno 145 que decir que hay 145 filas en esta tabla. He intentado lo siguiente (con algunas variaciones)

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

también trató

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

tanto volvió con resultados vacío.

¿Alguna idea? cualquier otra primitiva para obtener los nombres de columna de una tabla temporal en sybase?

+0

¿Has intentado buscar por OBJECT_ID ('tempdb .. # mytable')? –

+0

@Andriy - Eliminé mi respuesta sugiriendo 'SELECT nombre FROM tempdb..syscolumns WHERE id = OBJECT_ID ('tempdb .. # mytable')' como OP dijo "no devuelve nada en Sybase" –

Respuesta

2

Me disculpo pero no tengo Sybase para probar esto. Sin embargo, puedo darle lo que creo que es la respuesta, pero podría tomar un poco de trabajo de su parte para obtener la sintaxis correcta. Básicamente, según la documentación, puede usar el comando sp_help en su tabla temporal, siempre que lo haga desde el tempdb. Aquí está la cita de Sybase:

Los procedimientos del sistema como sp_help funcionan en tablas temporales solo si se invocan desde tempdb.

Reference

Aquí es como se puede utilizar el comando sp help:

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

La razón de que el comando OBJECT_ID(tempdb..#mytable) no funcionó es porque ese nombre de la tabla no existe en esa mesa . La razón es que Sybase garantiza que todas las tablas temporales sean únicas. Para hacerlo, toma el nombre de la tabla temporal (incluido el signo de libra) y lo trunca en 13 caracteres, agrega guiones bajos para que tenga 13 caracteres (en caso de que fuera corto) y agrega una ID de sesión de 17 dígitos al fin del nombre de la tabla. De esta forma, puede tener una tabla temporal llamada #mytable y otro usuario (o incluso usted en otra sesión) puede tener el mismo nombre exacto para una tabla temporal sin causar conflicto. Si descubrió su ID de sesión, probablemente podría construir su nombre de tabla temporal. Si construyó el nombre de la tabla temporal, puede asignarlo a una variable (digamos @newTableName) y usar el método SELECT name FROM tempdb..syscolumns WHERE id = OBJECT_ID(@newTableName) para recuperar las columnas de la tabla temporal.

-1

probar este

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

Sin el # o cualquier otro temp .. # mitabla referencia en su selección.

+0

Y por qué esto soluciona el problema ? – Nightfirecat

0

Ok, sé, un tema muy viejo, pero no pude encontrar una respuesta suficiente en ningún otro lado, así que investigué con la respuesta de IAmTimCorey como punto de partida.Esto dio el siguiente resultado:

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 

Ejemplo:

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> 

Observaciones:

  • La detección de columnas anulables se ha derivado de la documentación Sybase, pero por razones desconocidas para mí bit 3 del estado en tempdb..syscolumns no cambia en consecuencia, vea la columna num en mi ejemplo. Es por eso que agregué el estado de la columna de todos modos. Para identidad (bit 7) las cosas funcionan como se esperaba. Cualquier explicación sería muy apreciada.
  • Al usar isql, comience con ancho suficiente (por ejemplo, -w160)
  • El ancho de columna predeterminado para syscolumns.name y systypes.name es bastante grande, por lo tanto, estoy utilizando una subcadena (....). Ajuste el número de caracteres copiados (último parámetro de la subcadena()) si los nombres de sus columnas no encajan.
  • Al omitir 'tempdb ..' de los nombres de la tabla, esta consulta también funciona para las tablas normales que no son tempdb en caso de que se prefiera una consulta en lugar de utilizar los comandos sp_xxx.
Cuestiones relacionadas