Làm thế nào để bạn trả lại tên cột của một bảng?


239

Làm cách nào để trả về tên cột của bảng bằng SQL Server 2008? tức là một bảng chứa các cột này - id, tên, địa chỉ, quốc gia và tôi muốn trả lại chúng dưới dạng dữ liệu.

Câu trả lời:


399

Không chắc chắn nếu có một cách dễ dàng hơn trong phiên bản 2008.

USE [Database Name]
SELECT COLUMN_NAME,* 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'YourTableName' AND TABLE_SCHEMA='YourSchemaName'

6
'YourSchemaName' là gì?
Drewdin

12
'YourSchemaName' là lược đồ cho bảng bạn đang truy vấn. Ví dụ: dbo.myTable, 'dbo' là lược đồ mà 'myTable' thuộc về. Các lược đồ giúp dễ dàng gán quyền cho một nhóm thay vì từng bảng riêng lẻ. Cũng xem câu hỏi này: stackoverflow.com/questions/1062075/ từ
jmosesman

3
Đừng quên lệnh USE DatabaseName nếu không bạn có thể tìm kiếm trong cơ sở dữ liệu chính hoặc khác với bạn muốn
Muflix 24/2/2015

1
CHỌN COLUMN_NAME, * TỪ THÔNG TIN_SCHema.COLUMNS WHERE TABLE_NAME = 'YourTableName' VÀ TABLE_SCHema = 'dbo'
Usman Younas

112

Đây là cách dễ dàng nhất

exec sp_columns [tablename]

2
Điều này là ngắn và đơn giản, nên là câu trả lời chính xác. Tôi tưởng tượng nó không tồn tại khi câu hỏi ban đầu được hỏi :)
DanteTheSmith

1
Nếu lược đồ của bạn không phải là dbo, bạn phải truyền nó dưới dạng tham số bổ sung. exec sp_columns [TableName], @table_owner = [giản đồ]
Pradeep


13

Một phương pháp là truy vấn syscolumns:

select
   syscolumns.name as [Column],
   syscolumns.xusertype as [Type],
   sysobjects.xtype as [Objtype]
from 
   sysobjects 
inner join 
   syscolumns on sysobjects.id = syscolumns.id
where sysobjects.xtype = 'u'
and   sysobjects.name = 'MyTableName'
order by syscolumns.name

1
Tôi thật sự thich cai nay. Tuy nhiên, tôi thấy Objtypecột dư thừa :)
Joel

1
Sẽ không tốt hơn nếu viết đầy đủ tham gia (sysobjects để tham gia bên trong syscolumns sc trên so.id = sc.id)? Đây có vẻ như một câu trả lời lười biếng với chi phí hiệu suất. Tôi có thể sai ...
Mất

1
@Losbear đã thay đổi nó PS: Không lười biếng, nó chỉ là mã từ 8 năm trước. :) Thời xưa (tôi đã sử dụng SQL Server bắt đầu từ phiên bản 4.2), tôi thường viết các truy vấn SQL theo cách này. không có vấn đề hiệu suất.
splattne

9

Điều này có vẻ dễ dàng hơn một chút so với các đề xuất ở trên vì nó sử dụng hàm OBJECT_ID () để định vị id của bảng. Bất kỳ cột nào có id đó là một phần của bảng.

SELECT * 
  FROM syscolumns 
 WHERE id=OBJECT_ID('YOUR_TABLE') 

Tôi thường sử dụng một truy vấn tương tự để xem nếu một cột tôi biết là một phần của phiên bản mới hơn. Đó là cùng một truy vấn với việc thêm {AND name = 'Your_COLUMN'} vào mệnh đề where.

IF EXISTS (
        SELECT * 
          FROM syscolumns 
         WHERE id=OBJECT_ID('YOUR_TABLE') 
           AND name='YOUR_COLUMN'
        )
BEGIN
    PRINT 'Column found'
END

8

thử cái này

select * from <tablename> where 1=2

...............................................


Thú vị, nhưng logic đằng sau nó là gì?
nilakantha singh deo

@nilakanthasinghdeo, logic là nó sẽ luôn trả về 0 hàng với WHERE 1=2và nó vẫn sẽ trả về siêu dữ liệu cột. Nếu sử dụng giao diện lập trình như ODBC, thì thông tin cột này có thể truy cập dưới dạng danh sách / mảng từ đối tượng con trỏ trong chương trình, đây là thứ tôi đang tìm kiếm. Nó có thể không có ý nghĩa trong ngữ cảnh SQL thuần túy, nhưng là một cách tiếp cận cô đọng khi kết nối với cơ sở dữ liệu thông qua Python / Java / C / etc.
Arthur Hebert

5

Sau đây có vẻ giống như truy vấn được đề xuất đầu tiên ở trên nhưng đôi khi bạn phải chỉ định cơ sở dữ liệu để làm cho nó hoạt động. Lưu ý rằng truy vấn cũng sẽ hoạt động mà không chỉ định TABLE_SCHema:

SELECT COLUMN_NAME
FROM   YOUR_DB_NAME.INFORMATION_SCHEMA.COLUMNS
WHERE  TABLE_NAME = 'YOUR_TABLE_NAME' AND TABLE_SCHEMA = 'YOUR_DB_NAME'

4

tôi sử dụng

SELECT st.NAME, sc.NAME, sc.system_type_id
FROM sys.tables st
INNER JOIN sys.columns sc ON st.object_id = sc.object_id
WHERE st.name LIKE '%Tablename%'

3

Tại sao không thử điều này:

nhấp chuột phải vào bảng -> Bảng Script Như -> Tạo thành -> Cửa sổ Trình soạn thảo truy vấn mới?

Toàn bộ danh sách các cột được đưa ra trong kịch bản. Sao chép nó và sử dụng các trường khi cần thiết.


3
Tác giả có thể muốn biết làm thế nào để lấy tên cột từ bảng theo chương trình để sử dụng trong một thủ tục được lưu trữ hoặc tập lệnh khác.
KLee1

1
Câu trả lời nêu rõ "I want to return these as data", trong khi câu trả lời của bạn sẽ nhận được các giá trị, có khả năng OP muốn dữ liệu trong thời gian chạy.
StuperUser

2

USE[Database] SELECT TABLE_NAME,TABLE_SCHEMA,[Column_Name],[Data_type] FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='dbo'


1
CREATE PROCEDURE [dbo].[Usp_GetColumnName]      
        @TableName varchar(50)
AS
BEGIN   
    BEGIN
        SET NOCOUNT ON
        IF (@TableName IS NOT NULL) 
            select ORDINAL_POSITION OrderPosition,COLUMN_NAME ColumnName from information_schema.columns 
             where table_name =@TableName
             order by ORDINAL_POSITION
    END
END

2
Chào mừng đến với SO! Nhưng có vẻ như câu hỏi này đã có câu trả lời thỏa đáng khoảng ba năm trước ... Ngoài ra, khi đăng mã, hãy sử dụng {} để làm nổi bật nó. Hãy xem FAQ, nó có một số thông tin tốt về việc bắt đầu ở đây: stackoverflow.com/faq
Valentino Vranken

1

Tôi không chắc giá trị syscolumns.colid có giống với giá trị 'ORDINAL_POSITION' được trả về như một phần của sp_column hay không, nhưng trong phần tiếp theo tôi đang sử dụng nó theo cách đó - hy vọng tôi không hiểu sai ...

Đây là một biến thể nhỏ của một số câu trả lời khác mà tôi đã tìm thấy - Tôi sử dụng câu này vì 'vị trí' hoặc thứ tự của cột trong bảng rất quan trọng trong ứng dụng của tôi - về cơ bản tôi cần biết 'Cột (n) được gọi là gì ? '

sp_columns trả về một loạt các công cụ không liên quan và tôi xử lý một lựa chọn hơn các hàm T-SQL, vì vậy tôi đã đi theo lộ trình này:

select    
  syscolumns.name, 
  syscolumns.colid    
from     
  sysobjects, syscolumns  
where 
  sysobjects.id = syscolumns.id and   
  sysobjects.xtype = 'u' and   
  sysobjects.name = '<YOUR_TABLE>' 
order by syscolumns.colid 

Tôi đã sử dụng phương pháp này trong một thời gian dài, nhưng được khuyên chống lại nó. Trong thực tế, tôi đã gặp phải vấn đề chính xác mà tôi đã nói rằng tôi có thể ... nhiều khả năng các phiên bản mới của MSSQL sẽ thay đổi cú pháp. Ví dụ, nó được sử dụng là sys.object và sys.column trong các phiên bản lần đầu tiên tôi sử dụng kỹ thuật này. Giả sử lược đồ và các phương thức thủ tục được lưu trữ là bằng chứng chống lại điều này ... không chắc chắn, nhưng cho đến nay vẫn tốt.
RosieC

1

Mặc dù câu trả lời của @Gulzar Nazim là tuyệt vời, nhưng có thể dễ dàng hơn để bao gồm tên cơ sở dữ liệu trong truy vấn, có thể đạt được bằng SQL sau đây.

SELECT COLUMN_NAME, *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'you-table-name' AND TABLE_CATALOG='your-database-name'

1

Bạn có thể sử dụng mã dưới đây để in tất cả các tên cột; Bạn cũng có thể sửa đổi mã để in các chi tiết khác theo bất kỳ định dạng nào bạn thích

    declare @Result varchar(max)='
            '
            select @Result=@Result+''+ColumnName+'
            '
            from
            (
                select
                    replace(col.name, ' ', '_') ColumnName,
                    column_id ColumnId
                from sys.columns col
                    join sys.types typ on
                        col.system_type_id = typ.system_type_id AND col.user_type_id = typ.user_type_id
                where object_id = object_id('tblPracticeTestSections')
            ) t
            order by ColumnId
            print @Result

Đầu ra

column1
column2
column3
column4

Để sử dụng cùng một mã để in bảng và tên cột của nó là lớp C #, hãy sử dụng mã dưới đây:

    declare @TableName sysname = '<EnterTableName>'
    declare @Result varchar(max) = 'public class ' + @TableName + '
    {'

    select @Result = @Result + '
        public static string ' + ColumnName + ' { get { return "'+ColumnName+'"; } }
    '
    from
    (
        select
            replace(col.name, ' ', '_') ColumnName,
            column_id ColumnId
        from sys.columns col
            join sys.types typ on
                col.system_type_id = typ.system_type_id AND col.user_type_id = typ.user_type_id
        where object_id = object_id(@TableName)
    ) t
    order by ColumnId

    set @Result = @Result  + '
    }'

    print @Result

Đầu ra:

 public class tblPracticeTestSections
 {
   public static string column1 { get { return "column1"; } }

   public static string column2{ get { return "column2"; } }

   public static string column3{ get { return "column3"; } }

   public static string column4{ get { return "column4"; } }

 } 

0

Tôi chỉ sử dụng một truy vấn như Martin Smith đã đề cập, chỉ ngắn hơn một chút:

SELECT COLUMN_NAME 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'YourTableName'

0
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = N'TableName'

0

SysColumn không được dùng nữa , hãy sử dụng Sys.All_Columns:

Select  
 ObjectName       = Object_Name(Object_ID)  
,T.Name  
,C.*  
,T.*  
From   
           Sys.All_Columns C  
Inner Join Sys.Types       T  On T.User_Type_Id = C.User_Type_Id  
Where [Object_ID] = Object_ID('Sys.Server_Permissions')  
--Order By Name Asc  

Select * From Sys.Typessẽ mang lại user_type_id = IDloại. Điều này là duy nhất trong cơ sở dữ liệu. Đối với các loại dữ liệu hệ thống : user_type_id = system_type_id.


0
DECLARE @col NVARCHAR(MAX);
SELECT @col= COALESCE(@col, '') + ',' + COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS WHERE  Table_name = 'MxLocations';
SELECT @col;

0

NẾU bạn đang làm việc với postgresql, có khả năng nhiều hơn một lược đồ có thể có bảng có cùng tên trong trường hợp đó áp dụng truy vấn bên dưới

SELECT column_name, data_type 
FROM information_schema.columns
WHERE table_name = 'your_table_name' AND table_schema = 'your_schema_name’;

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.