Làm cách nào tôi có thể nhận được tên cột từ một bảng trong SQL Server?


715

Tôi muốn truy vấn tên của tất cả các cột của bảng. Tôi tìm thấy làm thế nào để làm điều này trong:

Nhưng tôi cần biết: làm thế nào điều này có thể được thực hiện trong Microsoft SQL Server (2008 trong trường hợp của tôi)?


48
Là một mẹo nhanh và bẩn, tôi thực sự muốn làmSELECT * FROM my_table WHERE 1=0
bgusach

12
@bgusach - Có vẻ như người dùng muốn tên của các cột dưới dạng các hàng trong một bảng, nhưng đối với những gì bạn đang cố gắng thực hiện, SELECT TOP 0 * FROM my_tablethì việc gõ phím ít hơn
Jake Wood

@bgusach: Nghe có vẻ như là một câu trả lời cho tôi. Bạn nên đăng nó.
palswim

Câu trả lời:


863

Bạn có thể có được thông tin này và nhiều hơn thế nữa bằng cách truy vấn các khung nhìn Lược đồ thông tin .

Truy vấn mẫu này:

SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = N'Customers'

Có thể được thực hiện trên tất cả các đối tượng DB này:


25
"N" trong "= N'Customers '" là viết tắt của từ gì?
Qbik

20
Qbik "N" nếu dùng chuỗi unicode giống như varchar trong ANSI (32 bit) và nvarchar trong unicode (64 bit)
thatsalok

9
xác nhận: cũng hoạt động cho MariaDB ! :) (không có Nortwind....)
jave.web

5
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = N'tableName';cái này hiệu quả với tôi
Pavol Tra Bắt

1
Tôi đã phải sử dụng TABLE_SCHEMA = '?' AND TABLE_NAME = '?'vì tôi đang sử dụng localhost và tôi có nhiều bảng có cùng tên nhưng trong các cơ sở dữ liệu khác nhau.
akinuri

194

Bạn có thể sử dụng các sp_column thủ tục được lưu trữ sẽ trả về thông tin liên quan đến tất cả các cột cho một bảng đã cho. Thông tin thêm có thể được tìm thấy ở đây http://msdn.microsoft.com/en-us/l Library / ms176077.aspx

Bạn cũng có thể làm điều đó bằng một truy vấn SQL. Một số điều như thế này sẽ giúp:

SELECT * FROM sys.columns WHERE object_id = OBJECT_ID('dbo.yourTableName') 

Hoặc một biến thể sẽ là:

SELECT   o.Name, c.Name
FROM     sys.columns c 
         JOIN sys.objects o ON o.object_id = c.object_id 
WHERE    o.type = 'U' 
ORDER BY o.Name, c.Name

Điều này nhận được tất cả các cột từ tất cả các bảng, được sắp xếp theo tên bảng và sau đó trên tên cột.


148
select *
from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME='tableName'

Điều này là tốt hơn so với nhận được sys.columnsbởi vì nó hiển thị DATA_TYPEtrực tiếp.


5
+1 vì đây là SQL ANSI tiêu chuẩn ( en.wikipedia.org/wiki/In information_schema) Các câu trả lời khác như sys.objects không chuẩn
Kỹ sư đảo ngược

Và nếu bảng nằm trong một lược đồ khác (biến thể "lược đồ" của máy chủ SQL) thêm AND TABLE_SCHEMA = 'schemaName'vào WHEREmệnh đề.
Johan

Rất hữu ích và bạn có thể thêm JOIN sys.types t on c.system_type_id = t.system_type_idvà thêm t.namevào câu lệnh 'CHỌN' của mình để nhận các loại bên cạnh mỗi tên cột.
Pac0

56

Bạn có thể sử dụng sp_helptrong SQL Server 2008.

sp_help <table_name>;

Phím tắt cho lệnh trên: chọn tên bảng (nghĩa là tô sáng nó) và nhấn ALT+ F1.


1
đây là bàn phím yêu thích tất cả thời gian của tôi. Tôi cũng gán sp_helptext cho Cntl-F1. Hai phím tắt này tiết kiệm rất nhiều thời gian!
Paul Wehland

44

Bằng cách sử dụng truy vấn này, bạn nhận được câu trả lời:

select Column_name 
from Information_schema.columns 
where Table_name like 'table name'

35

Bạn có thể viết truy vấn này để lấy tên cột và tất cả các chi tiết mà không cần sử dụng THÔNG TIN_SCHema trong MySql:

SHOW COLUMNS FROM database_Name.table_name;

7
@Benjamin, vì câu hỏi này dành cho SQL Server và câu trả lời này dành cho MySql
Caimen

1
Có thể hầu hết mọi người sử dụng MySql, đều gặp phải vấn đề này. Và tôi đã đề cập đến nó. Tôi đang sử dụng MySql.
Sachin Parse

5
Sẽ không có vấn đề gì nếu hầu hết mọi người sử dụng các RDBMS khác có cùng một vấn đề, điều đó không liên quan đến câu hỏi ban đầu và đẩy các câu trả lời có liên quan xuống sâu hơn.
Demonblack

1
Tôi downvote vì câu hỏi được gửi cụ thể đến mssql
Lucas

27
--This is another variation used to document a large database for conversion (Edited to --remove static columns)

SELECT o.Name                   as Table_Name
     , c.Name                   as Field_Name
     , t.Name                   as Data_Type
     , t.length                 as Length_Size
     , t.prec                   as Precision_
FROM syscolumns c 
     INNER JOIN sysobjects o ON o.id = c.id
     LEFT JOIN  systypes t on t.xtype = c.xtype  
WHERE o.type = 'U' 
ORDER BY o.Name, c.Name

--In the left join, c.type is replaced by c.xtype to get varchar types

22
SELECT name
FROM sys.columns
WHERE object_id = OBJECT_ID('TABLE_NAME')

TABLE_NAME là bàn của bạn


15
SELECT column_name, data_type, character_maximum_length, table_name,ordinal_position, is_nullable 
FROM information_schema.COLUMNS WHERE table_name LIKE 'YOUR_TABLE_NAME'
ORDER BY ordinal_position


11

Câu hỏi SO này thiếu cách tiếp cận sau:

-- List down all columns of table 'Logging'
select * from sys.all_columns where object_id = OBJECT_ID('Logging')

10

Nó sẽ kiểm tra xem cái đã cho tablecó phải là Bảng cơ sở hay không .

SELECT 
    T.TABLE_NAME AS 'TABLE NAME',
    C.COLUMN_NAME AS 'COLUMN NAME'
FROM INFORMATION_SCHEMA.TABLES T
INNER JOIN INFORMATION_SCHEMA.COLUMNS C ON T.TABLE_NAME=C.TABLE_NAME
    WHERE   T.TABLE_TYPE='BASE TABLE'
            AND T.TABLE_NAME LIKE 'Your Table Name'

10

Bạn có thể thử điều này. Điều này cung cấp cho tất cả các tên cột với các loại dữ liệu tương ứng của chúng.

desc <TABLE NAME> ;

Tôi biết điều này hoạt động trong Oracle. Nhưng điều này có hoạt động trong microsft SQL không? Cảm ơn bạn.
DxTx

6

bạn có thể sử dụng truy vấn này

SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME like N'%[ColumnName]%' and TABLE_NAME = N'[TableName]'

6
SELECT c.Name 
FROM sys.columns c
JOIN sys.objects o ON o.object_id = c.object_id
WHERE o.object_id = OBJECT_ID('TABLE_NAME')
ORDER BY c.Name

5

Một lựa chọn khác được cho là trực quan hơn là:

SELECT [name] 
FROM sys.columns 
WHERE object_id = OBJECT_ID('[yourSchemaType].[yourTableName]') 

Điều này cung cấp cho bạn tất cả các tên cột của bạn trong một cột duy nhất. Nếu bạn quan tâm đến siêu dữ liệu khác, bạn có thể thay đổi chỉnh sửa TUYÊN BỐ CHỌN ĐẾN SELECT *.


3

Tóm tắt các câu trả lời

Tôi có thể thấy nhiều câu trả lời và cách khác nhau để làm điều này nhưng có sự cọ xát trong việc này và đó là objective.

Vâng, mục tiêu. Nếu bạn muốn only knowtên cột bạn có thể sử dụng

SELECT * FROM my_table WHERE 1=0
or
SELECT TOP 0 * FROM my_table

Nhưng nếu bạn muốn usecác cột đó ở đâu đó hoặc chỉ cần nói manipulatechúng thì các truy vấn nhanh ở trên sẽ không được sử dụng. Bạn cần sử dụng

SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = N'Customers'

một cách nữa để biết một số cột cụ thể nơi chúng tôi cần một số cột tương tự

SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME like N'%[ColumnName]%' and TABLE_NAME = N'[TableName]'

1
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'name_of_your_table'

Các câu trả lời khác là như nhau.
Kiquenet

0
SELECT TOP (0) [toID]
      ,[sourceID]
      ,[name]
      ,[address]
  FROM [ReportDatabase].[Ticket].[To]

Đơn giản và không yêu cầu bất kỳ bảng sys

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.