2009-09-15 28 views
22

Tôi có quyền truy cập vào dòng lệnh isql và tôi muốn lấy Meta-Data của tất cả các bảng của một cơ sở dữ liệu đã cho, có thể trong một tệp được định dạng. Làm thế nào tôi có thể đạt được điều đó?Từ cơ sở dữ liệu Sybase, cách tôi có thể lấy mô tả bảng (tên và loại trường)?

Cảm ơn.

+0

Tôi nên đề cập đến rằng tôi hầu như không biết gì về cơ sở dữ liệu sybase. Tôi đang tìm lệnh sql. – aartist

Trả lời

52

Kiểm tra sysobjectssyscolumns bảng.

Here là sơ đồ của các bảng hệ thống Sybase.

Danh sách tất cả các bảng sử dụng:

SELECT * FROM sysobjects WHERE type = 'U' 

Bạn có thể thay đổi 'U' để các đối tượng khác:

  • C - tính cột
  • D - mặc
  • F - Chức năng SQLJ
  • L - log
  • N - partit điều kiện ion
  • P - Transact-SQL hoặc thủ tục SQLJ
  • PR - chuẩn bị các đối tượng (tạo ra bởi động SQL)
  • R - quy tắc
  • RI - tham chiếu hạn chế
  • S - bảng hệ thống
  • TR - kích hoạt
  • U - bảng người dùng
  • V - xem
  • XP - thủ tục được lưu trữ mở rộng

Danh sách các cột trong một bảng:

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

Điều này rất gần với bảng đơn. Tôi đang tìm kiếm cùng một dữ liệu trên tất cả các bảng của cơ sở dữ liệu. – aartist

+1

Câu hỏi cũ tôi biết, nhưng làm thế nào để tôi nhận được như vậy cho một bảng tạm thời? Tôi không thể tìm thấy nó trong sysobjects hoặc syscolumns. – 0fnt

+0

Thay 'SELECT *' bằng 'SELECT sc. *' Nếu bạn thiếu quyền đối với một số cột trên sysobject (như tôi làm). –

-1

Nếu Sybase là SQL-92 phù hợp sau đó thông tin này được lưu trữ trong các bảng INFORMATION_SCHEMA.

Vì vậy, sau đây sẽ cung cấp cho bạn một danh sách các bảng và quan điểm trong bất kỳ cơ sở dữ liệu SQL-92 phù hợp

SELECT TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES 
+0

Không may, đó không phải là trường hợp ... Cả Sybase ASE và Sybase SQL Anywhere đều có lượt xem từ điển độc quyền của riêng chúng –

+0

@Lukas. Tôi có ý kiến ​​khác. Không có gì sai với những gì tôi đã nói. Những gì sau từ tuyên bố của bạn là Sybase không tuân thủ SQL-92, không phải là tuyên bố của tôi là không chính xác. –

+0

;-) Như bạn muốn. Nhưng câu hỏi thực sự là về Sybase, chứ không phải SQL 92 ... Thực ra nó là về Sybase ASE, ngay cả khi điều đó không được tuyên bố rõ ràng bởi OP ... –

41

sp_help là những gì bạn đang tìm kiếm.

Từ Sybase tài liệu trực tuyến về thủ tục sp_help hệ thống:

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]

[...]

Đây là (một phần) đầu ra cho bảng các nhà xuất bản (dán từ 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 

Tuy trích dẫn 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

Tại sao câu trả lời này không nhận được nhiều phiếu bầu hơn? Đây là giải pháp hoàn hảo. – Nicolai

+0

Tôi thích giải pháp này hơn là truy vấn các bảng từ điển độc quyền, vì nó có vẻ đơn giản và mạnh mẽ hơn. Bạn có biết [cách lấy đúng tất cả các tập kết quả từ JDBC] (http://stackoverflow.com/questions/7298719/calling-sybase-adaptive-server-enterprises-sp-help-from-jdbc) –

+2

liên kết không còn hoạt động cho sp_help. Đã thử nó và phiên bản sybase của tôi nói "Lỗi: Thủ tục 'sp_help' không được tìm thấy (DBD: chuẩn bị thất bại)" ​​ – Joel

0

Nếu bạn muốn sử dụng một chương trình dòng lệnh, nhưng không bị hạn chế sử dụng SQL, bạn có thể sử dụng SchemaCrawler.SchemaCrawler là nguồn mở và có thể tạo các tệp ở dạng văn bản thuần, CSV hoặc (X) HTML.

2

sp_tables cũng sẽ hoạt động trong isql. Nó cung cấp cho bạn danh sách các bảng trong cơ sở dữ liệu hiện tại.

2

Bạn có thể tìm kiếm cột trong tất cả các bảng trong cơ sở dữ liệu sử dụng:

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

Khi tìm bảng người sử dụng, trong trường hợp nếu muốn tên chủ sở hữu bảng cũng có, bạn có thể sử dụng như sau:

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

Đây là một cách tiếp cận khác để lấy dữ liệu meta. này rất hữu ích lệnh SQL trả về cho bạn bảng/xem định nghĩa dưới dạng văn bản:

CHỌN văn bản TỪ syscomments WHERE id = object_id ('MySchema.MyTable') ORDER BY số, colid2, colid

Thưởng thức Patrick

+0

Dường như làm việc cho các khung nhìn, trình kích hoạt và các thủ tục được lưu trữ, nhưng không cho các bảng – tehvan

6

Sybase IQ:

describe table_name; 
+0

Thêm một số giải thích mã luôn mong muốn một câu trả lời hay. Xem câu trả lời của @ Pascal cho một câu trả lời tuyệt vời, nơi anh ta bao gồm các liên kết đến tài liệu và sao chép các thông tin có liên quan ở đây. –

+0

Xin chào, tôi nghĩ rằng lệnh "mô tả" không tồn tại trong 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

trong phiên bản Sybase tôi sử dụng, sau đây mang lại cho danh sách các cột cho sel 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

điều này không hoạt động trong Sybase ASE – markp

+0

Phiên bản tôi đã sử dụng là SAP IQ 16 (Tên mới cho Sybase) chọn @@ phiên bản; @@ phiên bản SAP IQ/16.0.102.6.1386/20147/P/sp10.15 ... –

+0

bạn đang nhầm lẫn một vài điều ... 1) Sybase là tên của một công ty có 4 sản phẩm RDBMS khác nhau (ASE, SQLAnywhere, IQ, Advantage) ... 2) khoảng 8 năm trước SAP mua Sybase, và hơn 8 năm qua SAP đã dần dần thay thế tên 'Sybase' bằng 'SAP'; OP đã gắn thẻ câu hỏi với 'sybase-ase' có nghĩa là 'Sybase ASE'; ngày nay 'Sybase ASE' đi theo một vài cái tên ... 'Sybase ASE' của chúng tôi bởi những người dùng ASE chết cứng và 'SAP ASE' bởi những người khác; Sybase ASE (aka SAP ASE) không giống với Sybase IQ (còn gọi là SAP IQ), tức là ASE và IQ là 2 sản phẩm RDBMS khác nhau – markp

Các vấn đề liên quan