2009-09-15 77 views

Respuesta

52

Verificar sysobjects y syscolumns tablas.

Here es un diagrama de las tablas del sistema Sybase.

Lista de todas las tablas de usuario:

SELECT * FROM sysobjects WHERE type = 'U' 

Usted puede cambiar 'U' a otros objetos:

  • C - columna
  • D computarizada - default
  • F - Función SQLJ
  • L - log
  • N - partit condición ion
  • P - Transact-SQL o procedimiento SQLJ
  • PR - preparan objetos (creados por SQL dinámico)
  • R - regla
  • RI - restricción de referencia
  • S - tabla de sistema
  • TR - gatillo
  • U - tabla de usuario
  • V - vista
  • XP - procedimiento almacenado extendido

Lista de columnas en una tabla:

SELECT sc.* 
FROM syscolumns sc 
INNER JOIN sysobjects so ON sc.id = so.id 
WHERE so.name = 'my_table_name' 
+0

Esto está muy cerca para una sola tabla. Estoy buscando los mismos datos en todas las tablas de una base de datos. – aartist

+1

Pregunta anterior que sé, pero ¿cómo obtengo lo mismo para una tabla temporal? No puedo encontrarlo en sysobjects o syscolumns. – 0fnt

+0

Reemplace 'SELECT *' by 'SELECT sc. *' Si no tiene permisos en algunas columnas en sysobjects (como yo). –

-1

Si Sybase SQL es compatible-92, esta información se almacena en las tablas INFORMATION.

Así que la siguiente información le dará una lista de tablas y vistas en cualquier base de datos SQL-92 compatible

SELECT TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES 
+0

Desafortunadamente, ese no es el caso ... Tanto Sybase ASE como Sybase SQL Anywhere incluyen sus propias vistas de diccionario –

+0

@Lukas. Siento disentir. No hay nada de malo en lo que dije. Lo que sigue de su afirmación es que Sybase no cumple con SQL-92, no es que mi afirmación sea incorrecta. –

+0

;-) Como lo desee. Pero la pregunta realmente era acerca de Sybase, no SQL 92 ... En realidad se trataba de Sybase ASE, incluso si eso no fue declarado explícitamente por el OP ... –

41

sp_help es lo que estás buscando.

De la documentación en línea Sybase en el procedimiento sp_help sistema:

Description

Reports information about a database object (any object listed in sysobjects) and about system or user-defined datatypes, as well as computed columns and function-based indexes. Column displays optimistic_index_lock.

Syntax

sp_help [objname]

[...]

Aquí está la salida (parcial) de la tabla publishers (pegado de Using sp_help on database objects):

Name    Owner  Object_type  Create_date 
---------------- ----------- ------------- ------------------------------ 
publishers   dbo   user table  Nov 9 2004 9:57AM 

(1 row affected) 
Column_name Type  Length Prec Scale Nulls Default_name Rule_name 
----------- ------- ------ ----- ------- ------- -------------- ---------- 
pub_id  char   4 NULL NULL  0 NULL   pub_idrule 
pub_name varchar  40 NULL NULL  1 NULL   NULL 
city  varchar  20 NULL NULL  1 NULL   NULL 
state  char   2 NULL NULL  1 NULL   NULL 
Access_Rule_name Computed_Column_object  Identity 
------------------- ------------------------- ------------ 
NULL    NULL         0 
NULL    NULL         0 
NULL    NULL         0 
NULL    NULL         0 

Aún citando Using sp_help on database objects:

If you execute sp_help without supplying an object name, the resulting report shows each object in sysobjects, along with its name, owner, and object type. Also shown is each user-defined datatype in systypes and its name, storage type, length, whether null values are allowed, and any defaults or rules bound to it. The report also notes if any primary or foreign key columns have been defined for a table or view.

+4

¿Por qué esta respuesta no recibió más votos por arriba? Esta es la solución perfecta. – Nicolai

+0

Me gusta más esta solución que consultar las tablas de diccionarios patentadas, ya que parece más simple y más robusta. ¿Sabe por casualidad [cómo recuperar correctamente todos los conjuntos de resultados de JDBC] (http://stackoverflow.com/questions/7298719/calling-sybase-adaptive-server-enterprises-sp-help-from-jdbc) –

+2

enlace no más tiempo funciona para sp_help. Lo intenté y mi versión de sybase dice "Error: Procedimiento 'sp_help' no encontrado (DBD: prepare failed)" – Joel

0

Si desea utilizar un programa de línea de comandos, pero no está restringido al uso de SQL, puede usar SchemaCrawler.SchemaCrawler es de código abierto y puede producir archivos en formato de texto plano, CSV o (X) HTML.

2

sp_tables también funcionará en isql. Le da la lista de tablas en la base de datos actual.

2

Puede buscar columna en todas las tablas de la base de datos usando:

SELECT so.name 
FROM sysobjects so 
INNER JOIN syscolumns sc ON so.id = sc.id 
WHERE sc.name = 'YOUR_COLUMN_NAME' 
1

Cuando la búsqueda de tabla de usuario, en el caso si desea que el nombre de propietario de la tabla también, puede utilizar el siguiente:

select su.name + '.' + so.name 
from sysobjects so, 
     sysusers su 
where so.type = 'U' and 
     so.uid = su.uid 
order by su.name, 
      so.name 
0

Aquí un enfoque diferente para obtener metadatos. Este muy votos comandos SQL que devuelve la tabla/vista de definición como texto:

texto SELECT syscomments donde id = OBJECT_ID orden de su número, colid2 ('MYSCHEMA.MYTABLE'), colid

Disfruta Patrick

+0

Parece que funciona para vistas, desencadenantes y procedimientos almacenados, pero no para las tablas – tehvan

6

Sybase IQ:

describe table_name; 
+0

Agregar alguna explicación del código siempre es deseable en una buena respuesta. Consulte la respuesta de @ Pascal para obtener una respuesta excelente, donde incluye enlaces a la documentación y copia la información relevante aquí. –

+0

Hola, creo que el comando "describir" no existe en Sybase IQ –

3
 SELECT 
DB_NAME() TABLE_CATALOG, 
NULL TABLE_SCHEMA, 
so.name TABLE_NAME, 
sc.name COLUMN_NAME, 
sc.colid ORDINAL_POSITION, 
NULL COLUMN_DEFAULT, 
CASE WHEN st.allownulls=1 THEN 'YES' 
ELSE 'NO' 
END IS_NULLABLE, 
st.name DATA_TYPE, 
CASE WHEN st.name like '%char%' THEN st.length 
END CHARACTER_MAXIMUM_LENGTH, 
CASE WHEN st.name like '%char%' THEN st.length 
END*2 CHARACTER_OCTET_LENGTH, 
CASE WHEN st.name in ('numeric','int') THEN st.length 
END NUMERIC_MAXIMUM_LENGTH, 
CASE WHEN st.name in ('numeric','int') THEN st.prec 
END NUMERIC_PRECISION, 
NULL NUMERIC_PRECISION_RADIX, 
CASE WHEN st.name in ('numeric','int') THEN st.scale 
END NUMERIC_SCALE, 
CASE WHEN st.name in ('datetime') THEN st.prec 
END DATETIME_PRECISION, 
NULL CHARACTER_SET_CATALOG, 
NULL CHARACTER_SET_SCHEMA, 
NULL COLLATION_CATALOG, 
NULL COLLATION_SCHEMA, 
NULL DOMAIN_CATALOG, 
NULL DOMAIN_SCHEMA, 
NULL DOMAIN_NAME 
FROM 
sysobjects so 
INNER JOIN 
syscolumns sc 
ON sc.id = so.id 
inner join systypes st on st.usertype = sc.usertype 
WHERE so.name = 'TableName' 
0

En la versión de Sybase que uso, la siguiente lista de columnas para sel da ected table

select * 
FROM sys.syscolumns sc 
where tname = 'YOUR_TABLE_NAME' 
--and creator='YOUR_USER_NAME' --if you want to further restrict tables 
--according to the user name that created it 
+0

esto no funciona en Sybase ASE – markp

+0

La versión que utilicé es SAP IQ 16 (Nuevo nombre para Sybase) seleccionar @@ versión; @@ versión SAP IQ/16.0.102.6.1386/20147/P/sp10.15 ... –

+0

está confundiendo un par de cosas ... 1) Sybase era el nombre de una compañía que tenía 4 productos diferentes de RDBMS (ASE, SQLAnywhere, IQ, Advantage) ... 2) Hace aproximadamente 8 años, SAP compró Sybase, y en estos últimos 8 años SAP ha reemplazado lentamente el nombre 'Sybase' por 'SAP'; el OP ha etiquetado la pregunta con 'sybase-ase' que significa 'Sybase ASE'; en la actualidad, 'Sybase ASE' tiene un par de nombres ... 'Sybase ASE' para nosotros los usuarios de ASE y 'SAP ASE' para todos los demás; Sybase ASE (también conocido como SAP ASE) no es lo mismo que Sybase IQ (también conocido como SAP IQ), es decir, ASE e IQ son 2 productos diferentes RDBMS – markp

Cuestiones relacionadas