Có một câu lệnh SQL có thể trả về loại cột trong bảng không?
INFORMATION_SCHEMA.COLUMNS
bảng - nếu RDBMS của bạn có thông tin đó.
Có một câu lệnh SQL có thể trả về loại cột trong bảng không?
INFORMATION_SCHEMA.COLUMNS
bảng - nếu RDBMS của bạn có thông tin đó.
Câu trả lời:
Sử dụng máy chủ SQL:
SELECT DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_NAME = 'yourTableName' AND
COLUMN_NAME = 'yourColumnName'
AND TABLE_SCHEMA = 'yourSchema'
varchar(255)
thay varchar
và int(11)
thay vì int
?
CHARACTER_MAXIMUM_LENGTH
trong 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.
Cách dễ nhất trong TSQL là:
SELECT COLUMN_NAME, DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'yourTableName'
Đố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
Alt+F1
.. cho kết quả tương tự.
Alt+F1
. Không có trong giải pháp Object Explorer. Đây là một tính năng hữu ích
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 = ''
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
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`;
DESCRIBE
cú 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.
information_schema.COLUMNS
.
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]');
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.
Để 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'
WHEN
dòng đầu tiên :WHEN tp.[name] IN ('varchar', 'char', 'varbinary') THEN...
Để 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
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
Sử dụng TSQL / MSSQL
Bạn có thể sử dụng INTO
từ khóa.
Kết quả của SELECT
một BẢNG thực sự
Thí dụ: select .... INTO real_table_name
Sau
sp_help real_table_name
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]
Đố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')
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"))
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
Một tùy chọn khác cho MS SQL là thay thế select
truy 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);
sys.syscolumns
bảng ví dụ.