Tablodaki bir sütunun türünü döndürebilen bir SQL ifadesi var mı?
INFORMATION_SCHEMA.COLUMNS
RDBMS'niz varsa, bu tür bilgileri tabloda bulabilirsiniz .
Tablodaki bir sütunun türünü döndürebilen bir SQL ifadesi var mı?
INFORMATION_SCHEMA.COLUMNS
RDBMS'niz varsa, bu tür bilgileri tabloda bulabilirsiniz .
Yanıtlar:
SQL Server'ı kullanma:
SELECT DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_NAME = 'yourTableName' AND
COLUMN_NAME = 'yourColumnName'
AND TABLE_SCHEMA = 'yourSchema'
varchar(255)
yerine varchar
ve int(11)
yerine int
?
CHARACTER_MAXIMUM_LENGTH
içindeki sütun kullanılarak mümkündür INFORMATION_SCHEMA.COLUMNS
. SELECT * FROM INFORMATION_SCHEMA.COLUMNS
Mevcut tüm sütunları görmek için sadece bir yap .
TSQL'de en kolay yol:
SELECT COLUMN_NAME, DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'yourTableName'
SQL Server için, bu sistem saklı yordamı sütun veri türleri dahil tüm tablo bilgilerini döndürür:
exec sp_help YOURTABLENAME
Alt+F1
.. aynı sonucu verir.
Alt+F1
. Çözüm Object Explorer'da değil. Bu yararlı bir özellik
TSQL / MSSQL'de şöyle görünür:
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 benzersiz değildir. sys.columns doc
MySQL kullanıyorsanız deneyebilirsiniz
SHOW COLUMNS FROM `tbl_name`;
Dev.mysql.com üzerinde KOLONLARI GÖSTER
Aksi takdirde,
DESCRIBE `tbl_name`;
DESCRIBE
Sözdizimi ancak MsSQL bu sözdizimini kabul etmeyecektir yanı Oracle geçerlidir.
information_schema.COLUMNS
.
MS SQL kullanan başka bir varyasyon:
SELECT TYPE_NAME(system_type_id)
FROM sys.columns
WHERE name = 'column_name'
AND [object_id] = OBJECT_ID('[dbo].[table_name]');
TSQL / MSSQL Kullanımı
Bu sorgu size şunları sağlar: tablo adı, sütun adı, veri türü, veri türü uzunluğu ve izin verilen boş değerler
SELECT TABLE_NAME,COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, IS_NULLABLE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'your_table_name'
Değiştirilmesi gereken tek şey tablonuz_adı.
Yukarıdaki yanıtlara dayanmak için, sütun veri türünü sütunları bildirmeniz gereken formatta elde etmek genellikle yararlıdır.
Örneğin varchar(50)
, varchar(max)
, decimal(p, s)
.
Bu, bunu yapmanızı sağlar:
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
satıra eklenerek kolayca ikram edilebilir :WHEN tp.[name] IN ('varchar', 'char', 'varbinary') THEN...
Bildirilen gerçek veri türlerini almak için, örneğin dinamik SQL'den ALTER COLUMN'lara kullanmak için, bunun gibi bir şey kullanılabilir:
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
Benim durumumda Dinamik SQL (Shudder!) İçin veri türünü almam gerekiyordu, yine de burada oluşturduğum, tam veri türünü döndüren bir işlev. Örneğin, 'ondalık' değerini döndürmek yerine DECIMAL (18,4) döndürür: dbo.GetLiteralDataType
TSQL / MSSQL Kullanımı
INTO
Anahtar kelime kullanabilirsiniz .
SELECT
Gerçek bir TABLO sonucu
Misal: select .... INTO real_table_name
Sonra
sp_help real_table_name
Şema, Tablo, Sütun, Tür, max_length, is_nullable değerini almak için bu sorguyu kullanın
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// ;
Tablodaki tüm sütunlar hakkında bilgi verecektir.
İçin Apache Derby gösterildiği gibi bu cevap :
select columndatatype from sys.syscolumns
where referenceid = (
select tableid from sys.systables
where tablename = 'YOUR_TABEL_NAME'
and columnname= 'YOUR_COLUMN_NAME')
Vb60'ta bunu yapabilirsiniz:
Public Cn As ADODB.Connection
'open connection
Dim Rs As ADODB.Recordset
Set Rs = Cn.OpenSchema(adSchemaColumns, Array(Empty, Empty, UCase("Table"), UCase("field")))
've sample (valRs benim işlevim rs.fields ("CHARACTER_MAXIMUM_LENGTH"). değer):
RT_Charactar_Maximum_Length = (ValRS(Rs, "CHARACTER_MAXIMUM_LENGTH"))
rt_Tipo = (ValRS(Rs, "DATA_TYPE"))
Bazı insanlar veri türüyle de hassaslık istediğinden, böyle bir amaçla oluşturduğum senaryomu paylaşmak istiyorum.
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'
Mükemmel değil ama çoğu durumda çalışır.
kullanma Sql-Server
MS SQL için başka bir seçenek select
de buradaki sorguyu, türleri için istediğiniz sorguyla değiştirmektir :
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
tablo var.