Як повернути назви стовпців таблиці?


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, інакше ви можете шукати в
головній

1
Виберіть COLUMN_NAME, * від INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'YourTableName' AND TABLE_SCHEMA = 'dbo'
Usman Younas

112

Це найпростіший спосіб

exec sp_columns [tablename]

2
Це коротко і просто, має бути правильною відповіддю. Я думаю, його не існувало, коли питання було задано спочатку :)
DanteTheSmith

1
Якщо ваша схема не є dbo, ви повинні передати її як додатковий параметр. exec sp_column [Таблиця], @table_owner = [схема]
Pradeep


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стовпчик є надлишковим :)
Joel

1
Чи не було б краще повністю виписати приєднання (sysobjects так внутрішні систематичні колонки sc на so.id = sc.id)? Це здається ледачою відповіддю за рахунок продуктивності. Я можу помилитися ...
Лосбер

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 / тощо.
Артур Геберт

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

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
Ласкаво просимо до SO! Але схоже, що це питання вже отримало задовільну відповідь близько трьох років тому ... Також, публікуючи код, використовуйте {}, щоб виділити його. Погляньте на поширені запитання, тут є хороша інформація про початок роботи тут: stackoverflow.com/faq
Valentino Vranken

1

Я не впевнений, чи значення syscolumn.colid таке ж, як значення "ORDINAL_POSITION", повернене як частина sp_column, але в подальшому я використовую це таким чином - сподіваюся, я не дезінформую ...

Ось невелика зміна деяких інших відповідей, які я знайшов - я використовую це, оскільки "позиція" або порядок стовпця в таблиці важливі в моїй програмі - я в основному повинен знати "Що називається стовпцем (n) ? '

sp_column повертає цілу купу сторонніх речей, і я зручніший із функціями Select, ніж 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. Column у версіях, в яких я вперше використав цю техніку. Нібито схема та збережені методи процедури є більш доказовим проти цього ... не впевнений, але поки що добре.
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

Я просто використовую запит, як згадував Мартін Сміт, трохи коротше:

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
DECLARE @col NVARCHAR(MAX);
SELECT @col= COALESCE(@col, '') + ',' + COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS WHERE  Table_name = 'MxLocations';
SELECT @col;

0

Якщо ви працюєте з postgresql, існує ймовірність, що більше однієї схеми може мати таблицю з таким самим іменем, у такому випадку застосуйте нижченаведений запит

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.