আপনি কীভাবে কোনও টেবিলের কলামের নামগুলি ফিরিয়ে আনবেন?


239

আমি কীভাবে এসকিউএল সার্ভার ২০০৮ ব্যবহার করে কোনও সারণীর কলামের নামগুলি ফিরিয়ে দেব? অর্থাত্ একটি সারণীতে এই কলামগুলি রয়েছে - আইডি, নাম, ঠিকানা, দেশ এবং আমি এগুলি ডেটা হিসাবে ফিরিয়ে দিতে চাই।

উত্তর:


399

2008 সংস্করণে আরও সহজ উপায় আছে কিনা তা নিশ্চিত নন।

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

6
'তোরস্কেমা নাম' কী?
ড্রিউদ্দিন

12
আপনি যে সারণীতে জিজ্ঞাসা করছেন সেটির জন্য 'ইয়োরস্কেমা নাম' হ'ল স্কিমা। উদাহরণ: dbo.myTable, 'dbo' হ'ল স্কাইমা যা 'মাই টেবিল' অন্তর্ভুক্ত। স্কিমাস পৃথকভাবে প্রতিটি টেবিলের পরিবর্তে একটি গ্রুপিংয়ে অনুমতিগুলি নির্ধারণ করা সহজ করে তোলে। : খুব এই প্রশ্ন দেখুন stackoverflow.com/questions/1062075/...
jmosesman

3
ইউএসই
ডাটাবেসনাম

1
নির্বাচন করুন COLUMN_NAME, * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'YourTableName' এবং TABLE_SCHEMA = 'dbo'
উসমান ইউনাস

112

এই সবচেয়ে সহজ উপায়

exec sp_columns [tablename]

2
এটি সংক্ষিপ্ত এবং সহজ, সঠিক উত্তর হওয়া উচিত। আমি ধারণা করি যখন প্রশ্নটি মূলত জিজ্ঞাসা করা হয়েছিল তখনই এটি উপস্থিত ছিল না :)
ড্যান্ট দ্য স্মিথ

1
আপনার স্কিমাটি ডিবিও না হলে আপনাকে অবশ্যই এটি অতিরিক্ত প্যারামিটার হিসাবে পাস করতে হবে। এক্সিকিউট এসপি_কলামগুলি [টেবিলের নাম], @ টেবিল_মালার = [স্কিমা]
প্রদীপ


13

একটি পদ্ধতি হ'ল সিস্টোলমগুলি জিজ্ঞাসা করা:

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
জয়েনটি পুরোপুরি লেখা (সিসোবজেক্টস যাতে অভ্যন্তরীণভাবে সিসক্লোলমস স্কে so.id = sc.id তে লিখতে হবে) না লিখলে ভাল হয় না? পারফরম্যান্স ব্যয়ে এটি অলস উত্তর বলে মনে হচ্ছে। আমি ভুল হতে পারি ...
লসবার

1
@ লসবার এটিকে পরিবর্তন করেছে পিএস: অলস নয়, এটি 8 বছর আগের কোড মাত্র। :) পুরানো কালে (আমি সংস্করণ ৪.২ থেকে এসকিউএল সার্ভার ব্যবহার করেছি), এসকিউএল কোয়েরিগুলি এভাবে লিখতাম। কোন কার্যকারিতা সমস্যা।
splattne

9

উপরের পরামর্শগুলি পরে এটি কিছুটা সহজ বলে মনে হচ্ছে কারণ এটি সারণীর আইডি সনাক্ত করতে OBJECT_ID () ফাংশনটি ব্যবহার করে । এই আইডি সহ যে কোনও কলামটি টেবিলের অংশ।

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

আমি জানি যে কলামটি নতুন সংস্করণের অংশ রয়েছে তা দেখতে আমি সাধারণত অনুরূপ ক্যোরি ব্যবহার করি। এটি যেখানে use ও নাম = '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

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


আকর্ষণীয় তবে এর পেছনে যুক্তি কী?
নীলকণ্ঠ সিংহ দেও

@ নীলকণ্ঠসিংহদেও, যুক্তিটি হ'ল এটি সর্বদা শূন্য সারি দিয়ে WHERE 1=2ফিরে আসবে এবং এটি কলামের মেটা-ডেটা ফিরিয়ে আনবে। যদি কোনও প্রোগ্রামেটিক ইন্টারফেস যেমন ওডিবিসি ব্যবহার করে থাকেন, তবে এই কলামের তথ্য প্রোগ্রামের মধ্যে কার্সার অবজেক্ট থেকে তালিকা / অ্যারে হিসাবে অ্যাক্সেসযোগ্য, যা আমি খুঁজছিলাম। খাঁটি এসকিউএল প্রসঙ্গে এটি বোধগম্য নয় তবে পাইথন / জাভা / সি / ইত্যাদির মাধ্যমে কোনও ডাটাবেসের সাথে সংযোগ করার সময় এটি একটি সংযোগ পদ্ধতি approach
আর্থার হেবার্ট

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", যখন আপনার উত্তরটি মানগুলি পাবে, সম্ভবত ওপি রান-টাইমে ডেটা চায়।
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
তাই আপনাকে স্বাগতম! তবে দেখে মনে হচ্ছে এই প্রশ্নটি প্রায় তিন বছর আগে ইতিমধ্যে একটি সন্তোষজনক উত্তর পেয়েছে ... এছাড়াও, কোড পোস্ট করার সময়, এটি হাইলাইট করার জন্য {use ব্যবহার করুন। : প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী কটাক্ষপাত আছে, এটা এখানে শুরু কিছু ভাল তথ্য আছে stackoverflow.com/faq
ভ্যালেনটিনো Vranken

1

আমি নিশ্চিত না যে সাইকোলেমস কোডলিড মানটি 'অর্ডিনালপোসিটিউশন' মানটি এসপি_কলামগুলির অংশ হিসাবে ফিরে এসেছে, তবে এর পরে আমি কীভাবে এটি ব্যবহার করছি - আশা করি আমি ভুল তথ্য দিচ্ছি না ...

আমি যে অন্য উত্তরগুলি পেয়েছি তার মধ্যে কিছুটা ভিন্নতা এখানে রয়েছে - আমি এটি ব্যবহার করি কারণ আমার আবেদনের ক্ষেত্রে সারণীর কলামের 'অবস্থান' বা ক্রমটি গুরুত্বপূর্ণ - আমাকে মূলত জানতে হবে 'কলাম (এন) কী বলে' ? '

স্প_কলামগুলি সম্পূর্ণ গুচ্ছ বহিরাগত স্টাফ দেয়, এবং আমি টি-এসকিউএল ফাংশনগুলির তুলনায় একটি নির্বাচন দিয়ে হ্যান্ডিয়ার হয়ে থাকি, তাই আমি এই পথে চলেছি:

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 

আমি এই পদ্ধতিটি দীর্ঘকাল ব্যবহার করেছি, তবে এর বিরুদ্ধে পরামর্শ দেওয়া হয়েছিল। আসলে আমি ঠিক যে সমস্যাটি আমাকে বলেছিলাম তা আমাকে আঘাত করেছে ... সম্ভবত এমএসএসকিউএল এর নতুন সংস্করণগুলি সিনট্যাক্স পরিবর্তন করবে। উদাহরণস্বরূপ এটি সংস্করণগুলিতে sys.object এবং sys.colouts ব্যবহৃত হত আমি প্রথম এই কৌশলটি ব্যবহার করেছি। মনে হয় স্কিমা এবং সঞ্চিত প্রক্রিয়া পদ্ধতিগুলি এর বিরুদ্ধে আরও প্রমাণ ... নিশ্চিত নয়, তবে এখনও পর্যন্ত এটি খুব ভাল।
রোজিসি

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

টেবিলটি প্রিন্ট করতে একই কোড ব্যবহার করতে এবং এর কলামের নাম সি # শ্রেণি হিসাবে নীচের কোডটি ব্যবহার করুন:

    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

যেহেতু সিসকলামগুলি অবচিত করা হয়েছে , তাই ব্যবহার করুন 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

যদি আপনি পোস্টগ্রিস্কল নিয়ে কাজ করছেন তবে একাধিক স্কিমাতে একই নামের সাথে টেবিল থাকতে পারে এমন ক্ষেত্রে নীচের ক্যোয়ারী প্রয়োগ করুন

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.