คำสั่ง SQL เพื่อรับชนิดคอลัมน์


302

มีคำสั่ง SQL ที่สามารถส่งคืนชนิดของคอลัมน์ในตารางได้หรือไม่?


5
ขึ้นอยู่กับ RDBMS; SQL Server มีsys.syscolumnsตารางเช่น
LittleBobbyTables - Au Revoir

3
ใช่ แต่มันจะแตกต่างกันไปขึ้นอยู่กับประเภทของ RDBMS ที่คุณใช้ - SQL เป็นภาษาไม่ใช่ผลิตภัณฑ์ฐานข้อมูลและคำถามนี้ขึ้นอยู่กับผลิตภัณฑ์เฉพาะ คุณจะสามารถค้นหาข้อมูลประเภทนี้ได้ในINFORMATION_SCHEMA.COLUMNSตาราง - หาก RDBMS ของคุณมีอยู่
สะพาน

คำตอบ:


461

ใช้ SQL Server:

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

11
เฉพาะในกรณีที่คุณไม่ต้องการเห็นชื่อคอลัมน์ที่เกี่ยวข้อง นี่จะคืนค่าประเภทเท่านั้น หากคุณต้องการดูชื่อคอลัมน์ประเภทนี้คุณจะต้องเลือก COLUMN_NAME ด้วย ...
HackyStack

5
และหากตารางของคุณไม่อยู่ในสคีมาเริ่มต้นคุณสามารถขยายเงื่อนไขด้วยAND TABLE_SCHEMA = 'yourSchema'
luviktor

8
สิ่งนี้ยอดเยี่ยม - แต่เป็นไปได้ไหมที่จะให้ส่งคืนช่วงสำหรับชนิดคอลัมน์ เช่นvarchar(255)แทนที่จะเป็นvarcharและint(11)แทนที่จะเป็นint?
Don Cheadle

13
@mmcrae: มันเป็นไปได้โดยใช้คอลัมน์ ในCHARACTER_MAXIMUM_LENGTH INFORMATION_SCHEMA.COLUMNSเพียงทำSELECT * FROM INFORMATION_SCHEMA.COLUMNSเพื่อดูคอลัมน์ทั้งหมดที่มี
ฟรานซิส P

2
แล้วตารางชั่วคราวล่ะ?
Ilya Gazman

77

วิธีที่ง่ายที่สุดใน TSQL คือ:

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

44

สำหรับ SQL Server ระบบนี้จะจัดเก็บกระบวนการส่งคืนข้อมูลตารางทั้งหมดรวมถึงคอลัมน์ข้อมูล:

exec sp_help YOURTABLENAME

5
ฉันโหวตเพราะนี่ไม่ใช่คำตอบที่แน่นอน แต่ให้ข้อมูลที่มีค่ากับฉัน เช่นข้อมูล "IsComputed" ที่ฉันไม่พบใน Information schema แต่ฉันสามารถค้นหาได้ในโค้ดโพรซีเดอร์ sp_help และคัดลอกจากที่นั่น
Christoph

2
เลือกชื่อตารางและคลิกAlt+F1.. ให้ผลเหมือนกัน
Pugal

เพื่อ clarifiy: Alt+F1ตารางหรือมุมมองชื่อจะต้องมีการเลือกในการแก้ไขและกด ไม่ได้อยู่ในโซลูชัน Object Explorer นี่เป็นคุณสมบัติที่มีประโยชน์เช่นกัน
bugybunny

18

ใน TSQL / MSSQL ดูเหมือนว่า:

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
ที่จริงแล้วมันคือJOIN sys.types y ON y.user_type_id = c.user_type_id system_type_id ไม่ซ้ำกัน sys.columns doc
Fabricio

12

ใน oracle SQL คุณต้องทำสิ่งนี้:

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

9

หากคุณใช้ MySQL คุณสามารถลอง

SHOW COLUMNS FROM `tbl_name`;

แสดงคอลัมน์บน dev.mysql.com

ไม่อย่างนั้นคุณน่าจะทำได้

DESCRIBE `tbl_name`;

1
ถ้าอย่างนั้นคุณหมายถึง RDBMS อื่นนอกเหนือจาก MySQL?
Lamak

2
ใช่. DESCRIBEไวยากรณ์ที่ถูกต้องใน Oracle เช่นกัน แต่ MsSQL จะไม่ยอมรับรูปแบบนี้
fimas

ดูคำตอบจาก @jTC สำหรับวิธีการใน MSSQL และ TSQL
fimas

รุ่นใหม่ของ MySQL information_schema.COLUMNSมี
Rick James

ฉันพบ DESC หรือ DESCRIBE (ขึ้นอยู่กับ DBMS ที่คุณใช้) มีประโยชน์สำหรับตารางขนาดเล็กที่มีคอลัมน์ 3 หรือ 4 คอลัมน์จากนั้นจะแสดงโครงสร้างของตารางที่มีชื่อคอลัมน์ว่าเป็น Nullable flag และประเภทของคอลัมน์สำหรับตารางขนาดใหญ่ ยากที่จะค้นหาข้อมูลที่คุณต้องการ
ความเร็ว

7

รูปแบบอื่นโดยใช้ MS SQL:

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

4

ใช้ TSQL / MSSQL

แบบสอบถามนี้จะช่วยให้คุณได้รับ: ชื่อตาราง, ชื่อคอลัมน์, ชนิดข้อมูล, ความยาวของชนิดข้อมูลและค่า Null ที่อนุญาต

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

สิ่งเดียวที่ต้องเปลี่ยนคือ your_table_name


4

หากต้องการสร้างคำตอบข้างต้นมักจะมีประโยชน์ในการรับชนิดข้อมูลคอลัมน์ในรูปแบบเดียวกับที่คุณต้องการประกาศคอลัมน์

ตัวอย่างเช่นvarchar(50), ,varchar(max)decimal(p, s)

สิ่งนี้ช่วยให้คุณทำสิ่งนี้ได้:

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
นี่ควรเป็นคำตอบที่ยอมรับได้ ขอบคุณบางทีคุณสามารถเพิ่มเงื่อนไข (t.type = 'U') - ลบตารางระบบ
Iannick

และประเภทของ VARBINARY สามารถรองรับได้ง่ายโดยการเพิ่มเข้าไปในWHENบรรทัดแรก:WHEN tp.[name] IN ('varchar', 'char', 'varbinary') THEN...
วิศวกรที่กลับรายการ

3
USE [YourDatabaseName]
GO

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

สิ่งนี้จะคืนค่าชื่อคอลัมน์ซึ่งแสดงชื่อของคอลัมน์และประเภทข้อมูลของคอลัมน์เหล่านั้น (ints, varchars ฯลฯ )



2

เมื่อต้องการดึงชนิดข้อมูลที่ประกาศจริงตัวอย่างเช่นใช้ในไดนามิก SQL เป็น ALTER COLUMNs คุณสามารถใช้บางสิ่งเช่นนี้ได้:

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

ในกรณีของฉันฉันจำเป็นต้องรับชนิดข้อมูลสำหรับ Dynamic SQL (Shudder!) ต่อไปนี่คือฟังก์ชันที่ฉันสร้างขึ้นที่ส่งคืนชนิดข้อมูลทั้งหมด ตัวอย่างเช่นแทนที่จะส่งกลับ 'ทศนิยม' มันจะส่งคืน DECIMAL (18,4): dbo.GetLiteralDataType


1

ใช้ TSQL / MSSQL

คุณสามารถใช้INTOคำสำคัญ

ผลลัพธ์ของSELECTการเป็นตารางจริง

ตัวอย่าง: select .... INTO real_table_name

หลังจาก

sp_help real_table_name

1

ใช้แบบสอบถามนี้เพื่อรับ Schema, ตาราง, คอลัมน์, ประเภท, 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// ;

มันจะให้ข้อมูลเกี่ยวกับคอลัมน์ทั้งหมดจากตาราง




0

ใน vb60 คุณสามารถทำได้:

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

'และตัวอย่าง (valRs เป็นฟังก์ชันของฉันสำหรับค่า rs.fields ("CHARACTER_MAXIMUM_LENGTH") ค่า):

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

0

เนื่องจากบางคนถามถึงความแม่นยำเช่นเดียวกับประเภทข้อมูลฉันต้องการแบ่งปันสคริปต์ของฉันที่ฉันสร้างขึ้นเพื่อวัตถุประสงค์ดังกล่าว

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'

มันไม่สมบูรณ์แบบ แต่ใช้งานได้ในกรณีส่วนใหญ่

การใช้ Sql-Server


-1

ตัวเลือกอื่นสำหรับ MS SQL คือการแทนที่selectแบบสอบถามที่นี่ด้วยแบบสอบถามที่คุณต้องการประเภท:

declare @sql varchar(4000);

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

select * from master.sys.dm_exec_describe_first_result_set (@sql, Null, 0);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.