Instrukcja SQL, aby uzyskać typ kolumny

301

Czy istnieje instrukcja SQL, która może zwrócić typ kolumny w tabeli?

czule
źródło
5
Zależy od RDBMS; SQL Server ma sys.syscolumnsna przykład tabelę.
LittleBobbyTables - Au Revoir
3
Tak, ale będzie różnie w zależności od używanego typu RDBMS - SQL to język, a nie produkt bazy danych, a to pytanie zależy od konkretnego produktu. Będziesz mógł znaleźć tego rodzaju informacje w INFORMATION_SCHEMA.COLUMNStabeli - jeśli Twój RDBMS je posiada.
Most

Odpowiedzi:

460

Za pomocą programu SQL Server:

SELECT DATA_TYPE 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE 
     TABLE_NAME = 'yourTableName' AND 
     COLUMN_NAME = 'yourColumnName'
Francis P.
źródło
11
Tylko jeśli nie chcesz zobaczyć odpowiedniej nazwy kolumny. Zwróci to tylko typy. Jeśli chcesz zobaczyć nazwę kolumny, do której należy ten typ, musisz także wybrać COLUMN_NAME również ...
HackyStack
5
A jeśli twój stół nie jest w domyślnym schemacie, możesz przedłużyć ten stan oAND TABLE_SCHEMA = 'yourSchema'
luviktor
8
to świetnie - ale czy można również zwrócić zakres dla typu kolumny? tj. varchar(255)zamiast varchari int(11)zamiast int?
Don Cheadle
13
@mmcrae: Możliwe jest użycie kolumny CHARACTER_MAXIMUM_LENGTHw INFORMATION_SCHEMA.COLUMNS. Po prostu zrób a, SELECT * FROM INFORMATION_SCHEMA.COLUMNSaby zobaczyć wszystkie dostępne kolumny.
Francis P
2
Co z tymczasowymi stolikami?
Ilya Gazman
77

Najłatwiejszym sposobem w TSQL jest:

SELECT COLUMN_NAME, DATA_TYPE 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'yourTableName'
HackyStack
źródło
44

W przypadku SQL Server ta procedura składowana w systemie zwróci wszystkie informacje o tabeli, w tym typy danych kolumn:

exec sp_help YOURTABLENAME
Hanif Azhari
źródło
5
Głosowałem za tym, ponieważ nie jest to dokładnie odpowiedź, ale dostarcza mi cennych informacji. Np. Informacje „IsComputed”, których nie znalazłem w schemacie informacji, ale mogę je znaleźć w kodzie procedury sp_help i stamtąd skopiować.
Christoph
2
wybierz nazwę tabeli i kliknij Alt+F1.. daje ten sam wynik.
Pugal
w celu wyjaśnienia: nazwę edytora lub tabeli należy wybrać w edytorze, a następnie nacisnąć Alt+F1. Nie w rozwiązaniu Object Explorer. Jest to bardzo przydatna funkcja
bugybunny
18

W TSQL / MSSQL wygląda to tak:

SELECT t.name, c.name 
FROM sys.tables t 
JOIN sys.columns c ON t.object_id = c.object_id
JOIN sys.types y ON y.user_type_id = c.user_type_id
WHERE t.name = ''
jTC
źródło
2
Właściwie to JOIN sys.types y ON y.user_type_id = c.user_type_id system_type_id nie jest unikalny. sys.columns doc
Fabricio
12

w Oracle Oracle zrobiłbyś to:

SELECT
    DATA_TYPE
FROM
    all_tab_columns 
WHERE
    table_name = 'TABLE NAME' -- in uppercase
AND column_name = 'COLUMN NAME' -- in uppercase
Assaf
źródło
9

Jeśli używasz MySQL, możesz spróbować

SHOW COLUMNS FROM `tbl_name`;

POKAŻ KOLUMNY na dev.mysql.com

W przeciwnym razie powinieneś być w stanie to zrobić

DESCRIBE `tbl_name`;
fimas
źródło
1
W przeciwnym razie masz na myśli inne RDBMS oprócz MySQL?
Lamak,
2
Tak. DESCRIBESkładnia jest poprawna w Oracle, jak również, jednak MsSQL nie zaakceptuje tej składni.
fimas
Zobacz odpowiedź na @jTC dla metody na MSSQL i TSQL.
fimas
Nowsze wersje MySQL mają information_schema.COLUMNS.
Rick James
Uważam, że DESC LUB DESCRIBE (w zależności od używanego DBMS) jest przydatny dla małych tabel z 3 lub 4 kolumnami, a następnie pokazuje strukturę tabeli z nazwą kolumny Nullable flag i typ kolumny dla dużych tabel, jednak zwracanie wyniku zajmuje więcej czasu i trudniej jest znaleźć potrzebne informacje.
prędkość
7

Kolejna odmiana korzystająca z MS SQL:

SELECT TYPE_NAME(system_type_id) 
FROM sys.columns 
WHERE name = 'column_name'
AND [object_id] = OBJECT_ID('[dbo].[table_name]');
Arne H. Bitubekk
źródło
4

Korzystanie z TSQL / MSSQL

To zapytanie zapewni Ci: nazwę tabeli, nazwę kolumny, typ danych, długość typu danych i dopuszczalne wartości null

SELECT TABLE_NAME,COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, IS_NULLABLE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'your_table_name'

Jedyną rzeczą, którą należy zmienić, jest nazwa_tabeli.

csebryam
źródło
4

Aby wykorzystać powyższe odpowiedzi, często przydatne jest uzyskanie typu danych kolumny w tym samym formacie, w którym należy zadeklarować kolumny.

Na przykład varchar(50), varchar(max), decimal(p, s).

To pozwala ci to zrobić:

SELECT 
  [Name]         = c.[name]
, [Type]         = 
    CASE 
      WHEN tp.[name] IN ('varchar', 'char') THEN tp.[name] + '(' + IIF(c.max_length = -1, 'max', CAST(c.max_length AS VARCHAR(25))) + ')' 
      WHEN tp.[name] IN ('nvarchar','nchar') THEN tp.[name] + '(' + IIF(c.max_length = -1, 'max', CAST(c.max_length / 2 AS VARCHAR(25)))+ ')'      
      WHEN tp.[name] IN ('decimal', 'numeric') THEN tp.[name] + '(' + CAST(c.[precision] AS VARCHAR(25)) + ', ' + CAST(c.[scale] AS VARCHAR(25)) + ')'
      WHEN tp.[name] IN ('datetime2') THEN tp.[name] + '(' + CAST(c.[scale] AS VARCHAR(25)) + ')'
      ELSE tp.[name]
    END
, [RawType]      = tp.[name]
, [MaxLength]    = c.max_length
, [Precision]    = c.[precision]
, [Scale]        = c.scale
FROM sys.tables t 
JOIN sys.schemas s ON t.schema_id = s.schema_id
JOIN sys.columns c ON t.object_id = c.object_id
JOIN sys.types tp ON c.user_type_id = tp.user_type_id
WHERE s.[name] = 'dbo' AND t.[name] = 'MyTable'
MgSam
źródło
1
To powinna być zaakceptowana odpowiedź. Dzięki, może możesz dodać warunek (t.type = 'U') - usuń tabelę systemową
Iannick
I typy VARBINARY można łatwo pokryć, dodając to do pierwszego WHENwiersza:WHEN tp.[name] IN ('varchar', 'char', 'varbinary') THEN...
Reversed Engineer
3
USE [YourDatabaseName]
GO

SELECT column_name 'Column Name',
data_type 'Data Type'
FROM information_schema.columns
WHERE table_name = 'YourTableName'
GO

Zwróci to wartości Nazwa kolumny, pokazując nazwy kolumn i typy danych tych kolumn (ints, varchars itp.).

Kprof
źródło
3

W przypadku IBM DB2 :

SELECT TYPENAME FROM SYSCAT.COLUMNS WHERE TABSCHEMA='your_schema_name' AND TABNAME='your_table_name' AND COLNAME='your_column_name'
Mężczyzna
źródło
2

Aby pobrać rzeczywiste zadeklarowane typy danych, na przykład do użycia w dynamicznym SQL do ZMIEŃ KOLUMNY, można użyć czegoś takiego:

SELECT
    TABLE_NAME, 
    COLUMN_NAME,
    DATA_TYPE
        + CASE WHEN DATA_TYPE IN ('char','nchar','varchar','nvarchar','binary','varbinary')
                    AND CHARACTER_MAXIMUM_LENGTH > 0 THEN
                 COALESCE('('+CONVERT(varchar,CHARACTER_MAXIMUM_LENGTH)+')','')
            ELSE '' END
        + CASE WHEN DATA_TYPE IN ('decimal','numeric') THEN
                COALESCE('('+CONVERT(varchar,NUMERIC_PRECISION)+','+CONVERT(varchar,NUMERIC_SCALE)+')','')
            ELSE '' END
        AS Declaration_Type,
    CASE WHEN IS_NULLABLE='NO' THEN 'NOT ' ELSE '' END + 'NULL' AS Nullable
FROM INFORMATION_SCHEMA.COLUMNS
ORDER BY 1,2
AjV Jsy
źródło
1

W moim przypadku i tak potrzebowałem uzyskać typ danych dla Dynamic SQL (Shudder!). Oto funkcja, którą utworzyłem, która zwraca pełny typ danych. Na przykład zamiast zwracać „dziesiętny”, zwraca DECIMAL (18,4): dbo.GetLiteralDataType

Anthony Griggs
źródło
1

Korzystanie z TSQL / MSSQL

Możesz użyć INTO słowa kluczowego.

Wynik SELECTw prawdziwej TABELI

Przykład: select .... INTO real_table_name

Po

sp_help real_table_name
Geza Bartha
źródło
1

Użyj tego zapytania, aby uzyskać schemat, tabelę, kolumnę, typ, maksymalną długość, is_nullable

SELECT QUOTENAME(SCHEMA_NAME(tb.[schema_id])) AS 'Schema'
    ,QUOTENAME(OBJECT_NAME(tb.[OBJECT_ID])) AS 'Table'
    ,C.NAME as 'Column'
    ,T.name AS 'Type'
    ,C.max_length
    ,C.is_nullable
FROM SYS.COLUMNS C INNER JOIN SYS.TABLES tb ON tb.[object_id] = C.[object_id]
    INNER JOIN SYS.TYPES T ON C.system_type_id = T.user_type_id
WHERE tb.[is_ms_shipped] = 0
ORDER BY tb.[Name]
Jigar Parekh
źródło
1
SHOW COLUMNS FROM //table_name// ;

Otrzymasz informacje o wszystkich kolumnach z tabeli.

Somil Gupta
źródło
0

Dla Apache Derby, jak pokazano w tej odpowiedzi :

select columndatatype from sys.syscolumns
  where referenceid = (
    select tableid from sys.systables
    where tablename = 'YOUR_TABEL_NAME'
    and columnname= 'YOUR_COLUMN_NAME')
Michał
źródło
0

W vb60 możesz to zrobić:

Public Cn As ADODB.Connection
'open connection
Dim Rs As ADODB.Recordset
 Set Rs = Cn.OpenSchema(adSchemaColumns, Array(Empty, Empty, UCase("Table"), UCase("field")))

”i sample (valRs to moja funkcja dla rs.fields („ CHARACTER_MAXIMUM_LENGTH ”). wartość):

 RT_Charactar_Maximum_Length = (ValRS(Rs, "CHARACTER_MAXIMUM_LENGTH"))
        rt_Tipo = (ValRS(Rs, "DATA_TYPE"))
R.Alonso
źródło
0

Ponieważ niektóre osoby pytały również o precyzję typu danych, chciałbym udostępnić mój skrypt, który stworzyłem w tym celu.

SELECT TABLE_NAME As 'TableName'
       COLUMN_NAME As 'ColumnName'
       CONCAT(DATA_TYPE, '(', COALESCE(CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, DATETIME_PRECISION, ''), IIF(NUMERIC_SCALE <> 0, CONCAT(', ', NUMERIC_SCALE), ''), ')', IIF(IS_NULLABLE = 'YES', ', null', ', not null')) As 'ColumnType'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE -- ...
ORDER BY 'TableName', 'ColumnName'

To nie jest idealne, ale działa w większości przypadków.

Za pomocą Sql-Server

Alexander Shuev
źródło
-1

Inną opcją dla MS SQL jest zastąpienie selectzapytania tutaj zapytaniem, którego chcesz użyć:

declare @sql varchar(4000);

set @sql = 'select ''hi'' as greeting';

select * from master.sys.dm_exec_describe_first_result_set (@sql, Null, 0);
Bob Krieter
źródło