มีคำสั่ง SQL ที่สามารถส่งคืนชนิดของคอลัมน์ในตารางได้หรือไม่?
INFORMATION_SCHEMA.COLUMNS
ตาราง - หาก RDBMS ของคุณมีอยู่
มีคำสั่ง SQL ที่สามารถส่งคืนชนิดของคอลัมน์ในตารางได้หรือไม่?
INFORMATION_SCHEMA.COLUMNS
ตาราง - หาก RDBMS ของคุณมีอยู่
คำตอบ:
ใช้ SQL Server:
SELECT DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_NAME = 'yourTableName' AND
COLUMN_NAME = 'yourColumnName'
AND TABLE_SCHEMA = 'yourSchema'
varchar(255)
แทนที่จะเป็นvarchar
และint(11)
แทนที่จะเป็นint
?
CHARACTER_MAXIMUM_LENGTH
INFORMATION_SCHEMA.COLUMNS
เพียงทำSELECT * FROM INFORMATION_SCHEMA.COLUMNS
เพื่อดูคอลัมน์ทั้งหมดที่มี
วิธีที่ง่ายที่สุดใน TSQL คือ:
SELECT COLUMN_NAME, DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'yourTableName'
สำหรับ SQL Server ระบบนี้จะจัดเก็บกระบวนการส่งคืนข้อมูลตารางทั้งหมดรวมถึงคอลัมน์ข้อมูล:
exec sp_help YOURTABLENAME
Alt+F1
.. ให้ผลเหมือนกัน
Alt+F1
ตารางหรือมุมมองชื่อจะต้องมีการเลือกในการแก้ไขและกด ไม่ได้อยู่ในโซลูชัน Object Explorer นี่เป็นคุณสมบัติที่มีประโยชน์เช่นกัน
ใน 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 = ''
JOIN sys.types y ON y.user_type_id = c.user_type_id
system_type_id ไม่ซ้ำกัน sys.columns doc
ใน oracle SQL คุณต้องทำสิ่งนี้:
SELECT
DATA_TYPE
FROM
all_tab_columns
WHERE
table_name = 'TABLE NAME' -- in uppercase
AND column_name = 'COLUMN NAME' -- in uppercase
หากคุณใช้ MySQL คุณสามารถลอง
SHOW COLUMNS FROM `tbl_name`;
ไม่อย่างนั้นคุณน่าจะทำได้
DESCRIBE `tbl_name`;
DESCRIBE
ไวยากรณ์ที่ถูกต้องใน Oracle เช่นกัน แต่ MsSQL จะไม่ยอมรับรูปแบบนี้
information_schema.COLUMNS
มี
รูปแบบอื่นโดยใช้ MS SQL:
SELECT TYPE_NAME(system_type_id)
FROM sys.columns
WHERE name = 'column_name'
AND [object_id] = OBJECT_ID('[dbo].[table_name]');
ใช้ 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
หากต้องการสร้างคำตอบข้างต้นมักจะมีประโยชน์ในการรับชนิดข้อมูลคอลัมน์ในรูปแบบเดียวกับที่คุณต้องการประกาศคอลัมน์
ตัวอย่างเช่น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'
WHEN
บรรทัดแรก:WHEN tp.[name] IN ('varchar', 'char', 'varbinary') THEN...
USE [YourDatabaseName]
GO
SELECT column_name 'Column Name',
data_type 'Data Type'
FROM information_schema.columns
WHERE table_name = 'YourTableName'
GO
สิ่งนี้จะคืนค่าชื่อคอลัมน์ซึ่งแสดงชื่อของคอลัมน์และประเภทข้อมูลของคอลัมน์เหล่านั้น (ints, varchars ฯลฯ )
สำหรับIBM DB2 :
SELECT TYPENAME FROM SYSCAT.COLUMNS WHERE TABSCHEMA='your_schema_name' AND TABNAME='your_table_name' AND COLNAME='your_column_name'
เมื่อต้องการดึงชนิดข้อมูลที่ประกาศจริงตัวอย่างเช่นใช้ในไดนามิก 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
ในกรณีของฉันฉันจำเป็นต้องรับชนิดข้อมูลสำหรับ Dynamic SQL (Shudder!) ต่อไปนี่คือฟังก์ชันที่ฉันสร้างขึ้นที่ส่งคืนชนิดข้อมูลทั้งหมด ตัวอย่างเช่นแทนที่จะส่งกลับ 'ทศนิยม' มันจะส่งคืน DECIMAL (18,4): dbo.GetLiteralDataType
ใช้ TSQL / MSSQL
คุณสามารถใช้INTO
คำสำคัญ
ผลลัพธ์ของSELECT
การเป็นตารางจริง
ตัวอย่าง: select .... INTO real_table_name
หลังจาก
sp_help real_table_name
ใช้แบบสอบถามนี้เพื่อรับ 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]
SHOW COLUMNS FROM //table_name// ;
มันจะให้ข้อมูลเกี่ยวกับคอลัมน์ทั้งหมดจากตาราง
สำหรับSpark SQL :
DESCRIBE [db_name.]table_name column_name
สำหรับApache Derbyดังแสดงในคำตอบนี้ :
select columndatatype from sys.syscolumns
where referenceid = (
select tableid from sys.systables
where tablename = 'YOUR_TABEL_NAME'
and columnname= 'YOUR_COLUMN_NAME')
ใน 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"))
เนื่องจากบางคนถามถึงความแม่นยำเช่นเดียวกับประเภทข้อมูลฉันต้องการแบ่งปันสคริปต์ของฉันที่ฉันสร้างขึ้นเพื่อวัตถุประสงค์ดังกล่าว
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
ตัวเลือกอื่นสำหรับ 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);
sys.syscolumns
ตารางเช่น