Как вы возвращаете имена столбцов таблицы?


239

Как мне вернуть имена столбцов таблицы, используя SQL Server 2008? то есть таблица содержит эти столбцы - идентификатор, имя, адрес, страну, и я хочу вернуть их как данные.

Ответы:


401

Не уверен, есть ли более простой способ в версии 2008 года.

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

7
Что такое 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'
Усман Юнас,

112

Это самый простой способ

exec sp_columns [tablename]

2
Это коротко и просто, должен быть правильный ответ. Я полагаю, что его не было, когда вопрос был задан изначально.
DanteTheSmith,

2
Если ваша схема не dbo, вы должны передать ее в качестве дополнительного параметра. exec 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 на so.id = sc.id)? Это похоже на ленивый ответ за счет производительности. Я могу ошибаться ...
Losbear

1
@Losbear изменил его PS: не ленивый, это просто код 8 лет назад. :) В старые времена (я использовал SQL Server, начиная с версии 4.2), я писал SQL-запросы таким образом. нет проблем с производительностью.
Сплаттне

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

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


Интересно, но какая логика стоит за этим?
Нилаканта Сингх део

@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


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
Добро пожаловать на ТАК! Но похоже, что на этот вопрос уже был получен удовлетворительный ответ около трех лет назад ... Кроме того, при публикации кода используйте {}, чтобы выделить его. Взгляните на FAQ, здесь есть хорошая информация о начале работы: stackoverflow.com/faq
Valentino Vranken

1

Я не уверен, совпадает ли значение syscolumns.colid со значением 'ORDINAL_POSITION', возвращаемым как часть sp_columns, но в дальнейшем я использую его таким образом - надеюсь, я не дезинформирую ...

Вот небольшая разница в некоторых других ответах, которые я нашел - я использую это, потому что «позиция» или порядок столбца в таблице важны для моего приложения - мне нужно знать, как называется «column (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

Я просто использую запрос, как упоминал Мартин Смит, чуть короче:

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.