आप किसी तालिका के कॉलम नामों को कैसे वापस करेंगे?


239

मैं SQL Server 2008 का उपयोग करके तालिका के स्तंभ नामों को कैसे वापस करूंगा? यानी एक तालिका में ये कॉलम हैं- आईडी, नाम, पता, देश और मैं इन्हें डेटा के रूप में वापस करना चाहता हूं।

जवाबों:


400

यकीन नहीं होता कि 2008 संस्करण में एक आसान तरीका है।

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

6
'YourSchemaName' क्या है?
ड्रियुद्दीन

12
'YourSchemaName' उस तालिका के लिए स्कीमा है, जिसके खिलाफ आप क्वेरी कर रहे हैं। उदाहरण: dbo.myTable, 'dbo' स्कीमा है जो 'myTable' से संबंधित है। स्कीमें व्यक्तिगत रूप से प्रत्येक तालिका के बजाय एक समूहीकरण के लिए अनुमतियाँ प्रदान करना आसान बनाती हैं। इस प्रश्न को भी देखें: stackoverflow.com/questions/1062075/…
jmosesman

3
USE DatabaseName कमांड को न भूलें अन्यथा आप जितना चाहें मास्टर या अलग डेटाबेस में खोज सकते हैं
Muflix

1
COLUMN_NAME का चयन करें, * INFORMATION_SCHEMA.COLUMNS से ​​TABLE_NAME = 'YourTableName' और TABLE_SCHEMA = 'dbo'
Usman Younas

112

यह सबसे आसान तरीका है

exec sp_columns [tablename]

2
यह छोटा और सरल है, सही उत्तर होना चाहिए। मुझे लगता है कि यह मौजूद नहीं था जब सवाल मूल रूप से पूछा गया था
DanteTheSmith

1
यदि आपका स्कीमा dbo नहीं है, तो आपको इसे एक अतिरिक्त पैरामीटर के रूप में पास करना होगा। कार्यकारी sp_columns [TableName], @table_owner = [स्कीमा]
प्रदीप


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कॉलम बेमानी लगता है , हालाँकि :)
जोएल

1
क्या पूरी तरह से जॉइन (sysobjects तो इनर जॉइन करना syscolumns sc on.id = sc.id) पर लिखना बेहतर नहीं होगा? यह प्रदर्शन की कीमत पर एक आलसी जवाब की तरह लगता है। मैं गलत हो सकता है ...
13

1
@ लॉस्बियर ने इसे बदल दिया PS: आलसी नहीं, यह 8 साल पहले से ही कोड है। :) पुराने समय में (मैंने संस्करण 4.2 पर शुरू होने वाले SQL सर्वर का उपयोग किया था), मैं इस तरह से SQL क्वेरी लिखता था। कोई प्रदर्शन मुद्दे नहीं।
शाम

9

यह थोड़ा आसान लगता है तो उपरोक्त सुझाव क्योंकि यह तालिका की आईडी का पता लगाने के लिए OBJECT_ID () फ़ंक्शन का उपयोग करता है । उस आईडी वाला कोई भी कॉलम तालिका का हिस्सा है।

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

मैं आमतौर पर एक समान क्वेरी का उपयोग करता हूं यह देखने के लिए कि क्या मुझे पता है कि एक नया संस्करण मौजूद है। यह उसी खंड के {{name = 'your_COLUMN'} के जोड़ के साथ एक ही प्रश्न है।

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

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


दिलचस्प है, लेकिन इसके पीछे तर्क क्या है?
नीलकंठ सिंह देव

@nilakanthasinghdeo, तर्क यह है कि यह हमेशा शून्य पंक्तियों के साथ लौटेगा WHERE 1=2और यह अभी भी कॉलम मेटा-डेटा लौटाएगा। यदि ओडीबीसी जैसे प्रोग्रामेटिक इंटरफ़ेस का उपयोग किया जाता है, तो यह कॉलम जानकारी प्रोग्राम के भीतर कर्सर ऑब्जेक्ट से एक सूची / सरणी के रूप में सुलभ है, जिसे मैं देख रहा था। यह एक शुद्ध SQL संदर्भ में समझ में नहीं आ सकता है, लेकिन पायथन / जावा / सी / आदि के माध्यम से एक डेटाबेस से कनेक्ट करते समय एक संक्षिप्त दृष्टिकोण है।
आर्थर हेबर्ट

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'

4

मैं उपयोग करता हूं

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

सिर्फ यही कोशिश क्यों न करें:

सही तालिका पर क्लिक करें -> स्क्रिप्ट तालिका के रूप में -> बनाएँ -> नई क्वेरी संपादक विंडो?

कॉलम की पूरी सूची स्क्रिप्ट में दी गई है। इसे कॉपी करें और आवश्यकतानुसार फ़ील्ड्स का उपयोग करें।


3
लेखक संभवतः यह जानना चाहता था कि किसी संग्रहीत कार्यविधि या अन्य स्क्रिप्ट में उपयोग के लिए तालिका से स्तंभ नाम प्रोग्रामिक रूप से कैसे प्राप्त किया जाए।
KLee1

1
उत्तर में कहा गया है "I want to return these as data", जबकि आपके उत्तर को मान मिलेगा, यह संभावना है कि ओपी रनटाइम पर डेटा चाहता है।
स्टॉपरयूजर


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
एसओ में आपका स्वागत है! लेकिन ऐसा लगता है कि यह सवाल लगभग तीन साल पहले ही संतोषजनक जवाब मिल गया था ... इसके अलावा, कोड पोस्ट करते समय, इसे उजागर करने के लिए {} का उपयोग करें। एफएक्यू पर एक नजर है, यह यहाँ शुरू करने पर कुछ अच्छी जानकारी है: stackoverflow.com/faq
वैलेंटिनो Vranken

1

अगर syscolumns.colid मान 'ORDINAL_POSITION' मान sp_columns के भाग के रूप में लौटाया गया है, तो मैं निश्चित नहीं हूं, लेकिन इस प्रकार मैं इसका उपयोग इस तरह से कर रहा हूं - आशा है कि मैं गलत नहीं कर रहा हूं ...

यहां मेरे द्वारा खोजे गए कुछ अन्य उत्तरों पर थोड़ा बदलाव किया गया है - मैं इसका उपयोग करता हूं क्योंकि तालिका में कॉलम की 'स्थिति' या क्रम मेरे आवेदन में महत्वपूर्ण है - मुझे मूल रूप से यह जानना होगा कि कॉलम (n) क्या है ? '

sp_columns बाहरी सामान का एक पूरा गुच्छा लौटाता है, और मैं टी-एसक्यूएल फ़ंक्शन की तुलना में चुनिंदा के साथ हैंडियर हूं, इसलिए मैं इस मार्ग पर गया:

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 संस्करणों में किया गया था, मैंने पहली बार इस तकनीक का उपयोग किया था। माना जाता है कि स्कीमा और संग्रहित प्रक्रिया विधियां इसके खिलाफ अधिक प्रमाण हैं ... निश्चित नहीं हैं, लेकिन अभी तक बहुत अच्छा है।
रोजी

1

जबकि @ गुलज़ार नाज़िम का उत्तर बहुत अच्छा है, संभवतः क्वेरी में डेटाबेस नाम को शामिल करना आसान है , जिसे निम्नलिखित एसक्यूएल द्वारा प्राप्त किया जा सकता है।

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

मैं सिर्फ मार्टिन स्मिथ की तरह एक प्रश्न का उपयोग करता हूं, बस थोड़ा कम:

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.Typesuser_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’;

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.