Jak zwracasz nazwy kolumn tabeli?


239

Jak mam zwrócić nazwy kolumn tabeli przy użyciu SQL Server 2008? tzn. tabela zawiera te kolumny - id, nazwa, adres, kraj i chcę je zwrócić jako dane.

Odpowiedzi:


400

Nie jestem pewien, czy jest łatwiejszy sposób w wersji 2008.

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

6
Co to jest „YourSchemaName”?
Drewdin,

12
„YourSchemaName” to schemat tabeli, o którą pytasz. Przykład: dbo.myTable, „dbo” jest schematem, do którego należy „myTable”. Schematy ułatwiają przypisywanie uprawnień do grupy zamiast do każdej tabeli osobno. Zobacz też to pytanie: stackoverflow.com/questions/1062075/…
jmosesman

3
Nie zapomnij o poleceniu USE DatabaseName, w przeciwnym razie możesz wyszukiwać w głównej lub innej bazie danych niż chcesz
Muflix

1
WYBIERZ COLUMN_NAME, * FROM INFORMACJE_SCHEMA.COLUMNS WHERE TABLE_NAME = „YourTableName” AND TABLE_SCHEMA = „dbo”
Usman Younas

112

To jest najłatwiejszy sposób

exec sp_columns [tablename]

2
To jest krótkie i proste, powinna być poprawna odpowiedź. Wyobrażam sobie, że nie istniało, kiedy pytanie zostało pierwotnie zadane :)
DanteTheSmith,

1
Jeśli twój schemat nie jest dbo, musisz przekazać go jako dodatkowy parametr. exec sp_columns [TableName], @table_owner = [schemat]
Pradeep


13

Jedną z metod jest zapytanie kwerend systemowych:

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
Naprawdę podoba mi się ten. Uważam jednak, że Objtypekolumna jest zbędna :)
Joel

1
Czy nie byłoby lepiej w pełni zapisać złączenie (sysobjects więc wewnętrzne złączenie syscolumns sc na so.id = sc.id)? To wydaje się leniwa odpowiedź kosztem wydajności. Mogę się mylić ...
Losbear,

1
@Losbear zmienił to PS: Nie jestem leniwy, to tylko kod sprzed 8 lat. :) W dawnych czasach (korzystałem z programu SQL Server od wersji 4.2) pisałem w ten sposób zapytania SQL. brak problemów z wydajnością.
splattne

9

Wydaje się to nieco łatwiejsze niż powyższe sugestie, ponieważ używa funkcji OBJECT_ID () do zlokalizowania identyfikatora tabeli. Każda kolumna o tym identyfikatorze jest częścią tabeli.

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

Często używam podobnego zapytania, aby sprawdzić, czy kolumna, którą znam, jest częścią nowszej wersji, jest obecna. Jest to to samo zapytanie z dodatkiem {AND name = 'YOUR_COLUMN'} do klauzuli where.

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

8

Spróbuj tego

select * from <tablename> where 1=2

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


Ciekawe, ale jaka jest za tym logika?
nilakantha singh deo

@nilakanthasinghdeo, logika jest taka, że ​​zawsze zwróci zero wierszy WHERE 1=2i nadal zwróci metadane z kolumny. Jeśli używasz interfejsu programistycznego, takiego jak ODBC, to informacje o kolumnie są dostępne jako lista / tablica z obiektu kursora w programie, czego szukałem. Może to nie mieć sensu w czystym kontekście SQL, ale jest zwięzłym podejściem podczas łączenia się z bazą danych przez Python / Java / C / itp.
Arthur Hebert

5

Poniższe wydaje się być jak pierwsze sugerowane zapytanie powyżej, ale czasami musisz określić bazę danych, aby działała. Pamiętaj, że zapytanie powinno również działać bez określania TABELI_SCHEMA:

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

4

używam

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

Dlaczego nie spróbować tego:

kliknij prawym przyciskiem myszy tabelę -> Tabela skryptów jako -> Utwórz w -> Okno nowego edytora zapytań?

Cała lista kolumn jest podana w skrypcie. Skopiuj go i użyj pól w razie potrzeby.


3
Autor prawdopodobnie chciał wiedzieć, jak programowo uzyskać nazwy kolumn z tabeli do użycia w procedurze przechowywanej lub w innym skrypcie.
KLee1

1
Odpowiedź stwierdza "I want to return these as data", podczas gdy twoja odpowiedź otrzyma wartości, prawdopodobnie OP chce danych w czasie wykonywania.
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
Witamy w SO! Wygląda jednak na to, że pytanie to uzyskało satysfakcjonującą odpowiedź około trzy lata temu ... Ponadto, wysyłając kod, użyj {}, aby go podświetlić. Zajrzyj do FAQ, zawiera dobre informacje na temat rozpoczęcia tutaj: stackoverflow.com/faq
Valentino Vranken

1

Nie jestem pewien, czy wartość syscolumns.colid jest taka sama, jak wartość „ORDINAL_POSITION” zwracana jako część sp_columns, ale w dalszej części używam jej w ten sposób - mam nadzieję, że nie mylę ...

Oto niewielka odmiana niektórych innych odpowiedzi, które znalazłem - używam tego, ponieważ „pozycja” lub kolejność kolumny w tabeli jest ważna w mojej aplikacji - w zasadzie muszę wiedzieć, co nazywa się kolumna (n) ?

sp_columns zwraca całą masę obcych rzeczy, a ja jestem bardziej wygodny z funkcjami select niż T-SQL, więc wybrałem tę trasę:

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 

Stosowałem tę metodę przez długi czas, ale odradzano mi ją. W rzeczywistości trafiłem w dokładnie ten problem, o którym mi powiedziano, że mogę ... jest bardziej prawdopodobne, że nowe wersje MSSQL zmienią składnię. Na przykład w wersjach, w których po raz pierwszy zastosowałem tę technikę, były to sys.object i sys.columns. Podobno metody schematu i procedury składowanej są na to większym dowodem ... nie jestem pewien, ale jak dotąd tak dobrze.
RosieC,

1

Chociaż odpowiedź @Gulzara Nazima jest świetna, prawdopodobnie łatwiej jest dołączyć do zapytania nazwę bazy danych , co można uzyskać za pomocą następującego kodu SQL.

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

1

Możesz użyć poniższego kodu, aby wydrukować wszystkie nazwy kolumn; Możesz także zmodyfikować kod, aby wydrukować inne szczegóły w dowolnym formacie

    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

Wynik

column1
column2
column3
column4

Aby użyć tego samego kodu do wydrukowania tabeli i jej nazwy kolumny jako klasy C #, użyj poniższego kodu:

    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

Wynik:

 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

Używam tylko zapytania takiego jak wspomniany Martin Smith, tylko trochę krótszego:

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


0

Ponieważ SysColumns jest przestarzałe , użyj 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.Typesprzyniesie user_type_id = IDtego typu. Jest to unikalne w obrębie bazy danych. Dla typów danych System: 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

Jeśli pracujesz z postgresql, istnieje możliwość, że więcej niż jeden schemat może mieć tabelę o tej samej nazwie, w takim przypadku zastosuj poniższe zapytanie

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.