Câu lệnh SQL để lấy kiểu cột


302

Có một câu lệnh SQL có thể trả về loại cột trong bảng không?


5
Phụ thuộc vào RDBMS; SQL Server có sys.syscolumnsbảng ví dụ.
LittleBulkTables - Au Revoir

3
Đúng, nhưng nó sẽ khác nhau tùy thuộc vào loại RDBMS bạn đang sử dụng - SQL là ngôn ngữ, không phải sản phẩm cơ sở dữ liệu và câu hỏi này phụ thuộc vào sản phẩm cụ thể. Bạn sẽ có thể tìm thấy loại thông tin này trong INFORMATION_SCHEMA.COLUMNSbảng - nếu RDBMS của bạn có thông tin đó.
Cầu

Câu trả lời:


461

Sử dụng máy chủ SQL:

SELECT DATA_TYPE 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE 
     TABLE_NAME = 'yourTableName' AND 
     COLUMN_NAME = 'yourColumnName'

11
Chỉ khi bạn không muốn thấy tên cột tương ứng. Điều này sẽ chỉ trả lại các loại. Nếu bạn muốn xem tên cột, loại thuộc về bạn cũng cần phải chọn COLUMN_NAME ...
HackyStack

5
Và nếu bảng của bạn không nằm trong lược đồ mặc định, bạn có thể mở rộng điều kiện vớiAND TABLE_SCHEMA = 'yourSchema'
luviktor

8
điều này thật tuyệt - nhưng liệu nó có thể trả về phạm vi cho kiểu cột không? tức là varchar(255)thay varcharint(11)thay vì int?
Don Cheadle

13
@mmcrae: Có thể sử dụng cột CHARACTER_MAXIMUM_LENGTHtrong INFORMATION_SCHEMA.COLUMNS. Chỉ cần làm một SELECT * FROM INFORMATION_SCHEMA.COLUMNSđể xem tất cả các cột có sẵn.
Francis P

2
Bàn tạm thời thì sao?
Ilya Gazman

77

Cách dễ nhất trong TSQL là:

SELECT COLUMN_NAME, DATA_TYPE 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'yourTableName'

44

Đối với SQL Server, quy trình được lưu trữ hệ thống này sẽ trả về tất cả thông tin bảng, bao gồm các kiểu dữ liệu cột:

exec sp_help YOURTABLENAME

5
Tôi nêu lên vì đây không phải là câu trả lời chính xác nhưng cung cấp thông tin có giá trị cho tôi. Ví dụ: thông tin "IsComputing" tôi không tìm thấy trong lược đồ Thông tin nhưng tôi có thể tìm thấy trong mã thủ tục sp_help và sao chép từ đó.
Christoph

2
chọn tên bảng và nhấp vào Alt+F1.. cho kết quả tương tự.
Polic

để làm rõ: bảng hoặc tên xem phải được chọn trong trình chỉnh sửa và sau đó nhấn Alt+F1. Không có trong giải pháp Object Explorer. Đây là một tính năng hữu ích
bugybunny

18

Trong TSQL / MSSQL có vẻ như:

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 = ''

2
Trên thực tế, nó là JOIN sys.types y ON y.user_type_id = c.user_type_id system_type_id không phải là duy nhất. sys.columns doc
Fabricio

12

trong SQL tiên tri bạn sẽ làm điều này:

SELECT
    DATA_TYPE
FROM
    all_tab_columns 
WHERE
    table_name = 'TABLE NAME' -- in uppercase
AND column_name = 'COLUMN NAME' -- in uppercase

9

Nếu bạn đang sử dụng MySQL, bạn có thể thử

SHOW COLUMNS FROM `tbl_name`;

HIỂN THỊ MÀU SẮC trên dev.mysql.com

Nếu không bạn sẽ có thể làm

DESCRIBE `tbl_name`;

1
Với trường hợp bạn có nghĩa là RDBMS khác ngoài MySQL?
Lamak

2
Đúng. Các DESCRIBEcú pháp có giá trị trong Oracle là tốt, tuy nhiên MSSQL sẽ không chấp nhận cú pháp này.
fimas

Xem câu trả lời từ @jTC để biết phương pháp về MSSQL và TSQL.
fimas

Các phiên bản mới hơn của MySQL có information_schema.COLUMNS.
Rick James

Tôi thấy DESC HOẶC MÔ TẢ (tùy thuộc vào DBMS bạn sử dụng) hữu ích cho các bảng nhỏ có 3 hoặc 4 cột, sau đó nó hiển thị cấu trúc bảng với tên cột Nullable và loại cột cho các bảng lớn tuy nhiên phải mất nhiều thời gian hơn để trả về kết quả và nó khó tìm thấy thông tin bạn cần
vận tốc

7

Một biến thể khác sử dụng MS SQL:

SELECT TYPE_NAME(system_type_id) 
FROM sys.columns 
WHERE name = 'column_name'
AND [object_id] = OBJECT_ID('[dbo].[table_name]');

4

Sử dụng TSQL / MSSQL

Truy vấn này sẽ giúp bạn: tên bảng, tên cột, kiểu dữ liệu, độ dài kiểu dữ liệu và null cho phép

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

Điều duy nhất cần thay đổi là your_table_name.


4

Để xây dựng các câu trả lời ở trên, thường rất hữu ích khi lấy kiểu dữ liệu cột theo cùng định dạng mà bạn cần khai báo cột.

Ví dụ, varchar(50), varchar(max), decimal(p, s).

Điều này cho phép bạn làm điều đó:

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'

1
Đây phải là câu trả lời được chấp nhận. Cảm ơn, có lẽ bạn có thể thêm điều kiện (t.type = 'U') - xóa bảng hệ thống
Iannick

Và các loại VARBINARY có thể dễ dàng được phục vụ bằng cách thêm nó vào WHENdòng đầu tiên :WHEN tp.[name] IN ('varchar', 'char', 'varbinary') THEN...
Kỹ sư đảo ngược

3
USE [YourDatabaseName]
GO

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

Điều này sẽ trả về các giá trị Tên cột, hiển thị cho bạn tên của các cột và Kiểu dữ liệu của các cột đó (ints, varchars, v.v.).


3

Đối với IBM DB2 :

SELECT TYPENAME FROM SYSCAT.COLUMNS WHERE TABSCHEMA='your_schema_name' AND TABNAME='your_table_name' AND COLNAME='your_column_name'

2

Để truy xuất các kiểu dữ liệu được khai báo thực tế, ví dụ như được sử dụng trong SQL động để ALTER COLUMN, có thể sử dụng một cái gì đó như thế này:

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

1

Trong trường hợp của tôi, tôi cần lấy kiểu dữ liệu cho Dynamic SQL (Shudder!) Dù sao đây là một hàm mà tôi đã tạo trả về kiểu dữ liệu đầy đủ. Ví dụ: thay vì trả về 'thập phân', nó sẽ trả về DECIMAL (18,4): dbo.GetLiteralDataType


1

Sử dụng TSQL / MSSQL

Bạn có thể sử dụng INTOtừ khóa.

Kết quả của SELECTmột BẢNG thực sự

Thí dụ: select .... INTO real_table_name

Sau

sp_help real_table_name

1

Sử dụng truy vấn này để nhận Schema, Table, Cột, Type, max_length, 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]

1
SHOW COLUMNS FROM //table_name// ;

Nó sẽ cung cấp cho bạn thông tin về tất cả các cột từ bảng.



0

Đối với Apache Derby như trong câu trả lời này :

select columndatatype from sys.syscolumns
  where referenceid = (
    select tableid from sys.systables
    where tablename = 'YOUR_TABEL_NAME'
    and columnname= 'YOUR_COLUMN_NAME')

0

Trong vb60 bạn có thể làm điều này:

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

'và mẫu (valR là chức năng của tôi cho rs.fields ("CHARACTER_MAXIMUM_LENGTH"). value):

 RT_Charactar_Maximum_Length = (ValRS(Rs, "CHARACTER_MAXIMUM_LENGTH"))
        rt_Tipo = (ValRS(Rs, "DATA_TYPE"))

0

Vì một số người đã yêu cầu độ chính xác cũng như kiểu dữ liệu, tôi muốn chia sẻ tập lệnh của tôi mà tôi đã tạo cho mục đích như vậy.

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'

Nó không hoàn hảo nhưng nó hoạt động trong hầu hết các trường hợp.

Sử dụng Sql-Server


-1

Một tùy chọn khác cho MS SQL là thay thế selecttruy vấn ở đây bằng truy vấn bạn muốn các loại cho:

declare @sql varchar(4000);

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

select * from master.sys.dm_exec_describe_first_result_set (@sql, Null, 0);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.