คุณจะคืนชื่อคอลัมน์ของตารางได้อย่างไร


239

ฉันจะคืนชื่อคอลัมน์ของตารางโดยใช้ SQL Server 2008 ได้อย่างไร เช่นตารางที่มีคอลัมน์ - id, ชื่อ, ที่อยู่, ประเทศและฉันต้องการคืนค่าเหล่านี้เป็นข้อมูล

คำตอบ:


400

ไม่แน่ใจว่ามีวิธีที่ง่ายกว่าในรุ่น 2008 หรือไม่

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

6
'YourSchemaName' คืออะไร?
Drewdin

12
'YourSchemaName' เป็นสคีมาสำหรับตารางที่คุณสอบถาม ตัวอย่าง: dbo.myTable 'dbo' เป็นสคีมาที่เป็น 'myTable' Schemas ทำให้การกำหนดสิทธิ์ให้กับการจัดกลุ่มแทนแต่ละตารางทำได้ง่ายขึ้น ดูคำถามนี้เช่นกัน: stackoverflow.com/questions/1062075/…
jmosesman

3
อย่าลืมคำสั่ง USE DatabaseName มิฉะนั้นคุณสามารถค้นหาในฐานข้อมูลหลักหรือที่แตกต่างจากที่คุณต้องการ
Muflix

1
SELECT COLUMN_NAME * จาก INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'YourTableName' และ TABLE_SCHEMA = 'dbo'
Usman Younas

112

นี่เป็นวิธีที่ง่ายที่สุด

exec sp_columns [tablename]

2
สั้นและง่ายควรเป็นคำตอบที่ถูกต้อง ผมคิดว่ามันไม่ได้อยู่เมื่อถูกถามคำถามเดิม :)
DanteTheSmith

1
หากสคีมาของคุณไม่ใช่ dbo คุณต้องผ่านมันเป็นพารามิเตอร์เพิ่มเติม exec sp_columns [TableName], @table_owner = [schema]
Pradeep


13

วิธีหนึ่งคือการค้นหา 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
ฉันชอบอันนี้มาก ฉันพบObjtypeคอลัมน์ที่ซ้ำซ้อน :) :)
Joel

1
มันจะดีกว่าหรือไม่ที่จะเขียนการเข้าร่วมอย่างสมบูรณ์ (sysobjects ดังนั้นการรวมภายใน syscolumns sc on so.id = sc.id)? ดูเหมือนว่าคำตอบที่ขี้เกียจที่ค่าใช้จ่ายของประสิทธิภาพ ฉันอาจผิด ...
Losbear

1
@Losbear เปลี่ยนเป็น PS: ไม่ขี้เกียจมันเป็นแค่รหัสจาก 8 ปีที่แล้ว :) ในสมัยก่อน (ฉันใช้ SQL Server เริ่มที่รุ่น 4.2) ฉันเคยเขียนคำสั่ง SQL ด้วยวิธีนี้ ไม่มีปัญหาเรื่องประสิทธิภาพ
splattne

9

ดูเหมือนว่าจะง่ายกว่าคำแนะนำข้างต้นเล็กน้อยเพราะใช้ฟังก์ชัน OBJECT_ID ()เพื่อค้นหารหัสของตาราง คอลัมน์ใด ๆ ที่มีรหัสนั้นเป็นส่วนหนึ่งของตาราง

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

ฉันมักจะใช้แบบสอบถามที่คล้ายกันเพื่อดูว่าคอลัมน์ที่ฉันรู้ว่าเป็นส่วนหนึ่งของรุ่นที่ใหม่กว่าอยู่หรือไม่ มันเป็นข้อความค้นหาเดียวกันกับการเพิ่ม {AND name = 'YOUR_COLUMN'} ในส่วนคำสั่ง where

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

8

ลองนี้

select * from <tablename> where 1=2

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


น่าสนใจ แต่ตรรกะอะไรที่อยู่เบื้องหลัง
nilakantha singh deo

@nilakanthasinghdeo ตรรกะคือมันจะกลับเป็นศูนย์แถวเสมอWHERE 1=2และมันจะยังคงกลับเมตาดาต้าคอลัมน์ หากใช้อินเทอร์เฟซแบบเป็นโปรแกรมเช่น ODBC ข้อมูลคอลัมน์นี้สามารถเข้าถึงได้เป็นรายการ / อาร์เรย์จากวัตถุเคอร์เซอร์ภายในโปรแกรมซึ่งเป็นสิ่งที่ฉันกำลังมองหา มันอาจไม่สมเหตุสมผลในบริบท SQL แท้ๆ แต่เป็นแนวทางที่กระชับเมื่อเชื่อมต่อกับฐานข้อมูลผ่าน Python / Java / C / ฯลฯ
Arthur Hebert

5

ต่อไปนี้ดูเหมือนจะเป็นข้อความค้นหาแรกที่แนะนำข้างต้น แต่บางครั้งคุณต้องระบุฐานข้อมูลเพื่อให้มันทำงาน โปรดทราบว่าแบบสอบถามควรทำงานได้โดยไม่ต้องระบุ TABLE_SCHEMA:

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


3

ทำไมไม่ลองอันนี้:

คลิกขวาบนตาราง -> ตารางสคริปต์เป็น -> สร้างถึง -> หน้าต่างตัวแก้ไขคิวรีใหม่?

รายการคอลัมน์ทั้งหมดจะได้รับในสคริปต์ คัดลอกและใช้ฟิลด์ตามที่จำเป็น


3
ผู้เขียนต้องการทราบวิธีรับชื่อคอลัมน์จากตารางโดยทางโปรแกรมเพื่อใช้ในกระบวนงานที่เก็บไว้หรือสคริปต์อื่น ๆ
KLee1

1
คำตอบระบุ"I want to return these as data"ในขณะที่คำตอบของคุณจะได้รับค่าเป็นไปได้ว่า OP ต้องการข้อมูลในขณะทำงาน
StuperUser


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
ยินดีต้อนรับสู่ SO! แต่ดูเหมือนว่าคำถามนี้จะได้รับคำตอบที่น่าพอใจเมื่อประมาณสามปีที่แล้ว ... นอกจากนี้เมื่อโพสต์โค้ดให้ใช้ {} เพื่อไฮไลต์ ดูคำถามที่พบบ่อยมีข้อมูลที่ดีเกี่ยวกับการเริ่มต้นที่นี่: stackoverflow.com/faq
Valentino Vranken

1

ฉันไม่แน่ใจว่าค่า syscolumns.colid เป็นค่าเดียวกับค่า 'ORDINAL_POSITION' ที่ส่งคืนเป็นส่วนหนึ่งของ sp_columns หรือไม่ แต่ในสิ่งต่อไปนี้ฉันใช้มันในแบบนั้น - หวังว่าฉันจะไม่เข้าใจผิด ...

นี่คือความแตกต่างเล็กน้อยของคำตอบอื่น ๆ ที่ฉันพบ - ฉันใช้สิ่งนี้เพราะ 'ตำแหน่ง' หรือคำสั่งของคอลัมน์ในตารางมีความสำคัญในแอปพลิเคชันของฉัน - โดยทั่วไปฉันต้องรู้ 'คอลัมน์ (n) คืออะไร ?'

sp_columns ส่งคืนสิ่งที่ไม่เกี่ยวข้องทั้งหมดและฉันเลือกได้มากกว่าฟังก์ชั่น T-SQL ดังนั้นฉันจึงไปเส้นทางนี้:

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 

ฉันใช้วิธีนี้มาเป็นเวลานาน แต่ไม่ได้รับคำแนะนำ ในความเป็นจริงฉันพบปัญหาตรงที่ฉันบอกว่าฉันอาจ ... เป็นไปได้มากว่า MSSQL เวอร์ชันใหม่จะเปลี่ยนไวยากรณ์ ตัวอย่างเช่นเคยเป็น sys.object และ sys.columns ในรุ่นแรกที่ฉันใช้เทคนิคนี้ใน สคีมาและวิธีการที่จัดเก็บไว้นั้นน่าจะพิสูจน์ได้มากกว่าเรื่องนี้ ... ไม่แน่ใจ แต่ก็ยังดีอยู่
RosieC

1

แม้ว่าคำตอบของ @Gulzar Nazim นั้นยอดเยี่ยม แต่ก็อาจจะง่ายกว่าหากรวมชื่อฐานข้อมูลในแบบสอบถามซึ่งสามารถทำได้โดย SQL ต่อไปนี้

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

1

คุณสามารถใช้รหัสด้านล่างเพื่อพิมพ์ชื่อคอลัมน์ทั้งหมด คุณยังสามารถแก้ไขรหัสเพื่อพิมพ์รายละเอียดอื่น ๆ ในรูปแบบใดก็ได้ที่คุณชอบ

    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

เอาท์พุต

column1
column2
column3
column4

หากต้องการใช้รหัสเดียวกันเพื่อพิมพ์ตารางและชื่อคอลัมน์ในคลาส C # ให้ใช้รหัสด้านล่าง:

    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

เอาท์พุท:

 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

ฉันแค่ใช้แบบสอบถามอย่าง Martin Smith ที่กล่าวถึงเพียงเล็กน้อยสั้น ๆ :

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


0

ตั้งแต่syscolumns จะเลิกใช้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.Typesจะให้ผล user_type_id = IDของประเภท สิ่งนี้มีลักษณะเฉพาะในฐานข้อมูล user_type_id = system_type_idสำหรับชนิดข้อมูลระบบ:



0

หากคุณกำลังทำงานกับ postgresql มีความเป็นไปได้ที่มากกว่าหนึ่งสกีมาอาจมีตารางที่มีชื่อเดียวกันในกรณีนั้นใช้แบบสอบถามด้านล่าง

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.