我如何从查询中返回SQL数据类型? 我有一个SQL查询,该查询查询了一个巨大的(如,数百个视图/表具有难以读取名称(例如CMM-CPP-fap-add)的数据库,我不需要也不需要理解。 此查询的结果...

问题描述 投票:0回答:9
SELECT Auth_First_Name, Auth_Last_Name, Auth_Favorite_Number FROM Authors

我想知道这一点,我想知道:

Auth_First_Name is char(25) Auth_Last_Name is char(50) Auth_Favorite_Number is int

我对约束不感兴趣,我真的只想知道数据类型。

对于SQL Server 2012及以上:如果将查询放入字符串中,则可以将结果设置为类似的数据类型:

DECLARE @query nvarchar(MAX) = 'select 12.1 / 10.1 AS [Column1]';
EXEC sys.sp_describe_first_result_set @query, NULL, 0;

也有一个函数版本,类似地称为:

DECLARE @query nvarchar(max) = 'select 12.1 / 10.1 AS [Column1]';
SELECT *
FROM sys.dm_exec_describe_first_result_set(@query, NULL, NULL);

功能的优点是您可以选择在

SELECT
sql sql-server t-sql sql-server-2008
9个回答
95
投票

select * from information_schema.columns
可以让您入门。
    

您还可以将结果(或前10个结果)插入临时表中,并从临时表中获取列(只要列名称都不同)。
SELECT TOP 10 *
INTO #TempTable
FROM <DataSource>

然后使用:

EXEC tempdb.dbo.sp_help N'#TempTable';


75
投票
SELECT * 
FROM tempdb.sys.columns 
WHERE [object_id] = OBJECT_ID(N'tempdb..#TempTable');

在这里从

aaron的答案中解释了。

39
投票
您也可以使用...

SQL_VARIANT_PROPERTY()
...如果您无法直接访问元数据(例如,也许是链接的服务器查询?)。

SQL_VARIANT_PROPERTY(TRASSACT-SQL)

在SQL Server 2005及以后,最好使用目录视图(SYS.Columns)而不是Information_Schema。  除非对其他平台的可移植性很重要。  请记住,信息_schema视图不会改变,因此他们将逐渐缺少有关SQL Server连续版本的新功能等的信息。
    

必须更轻松地做到这一点...低,看,有...!


34
投票
”是您的朋友!

现在,我确实意识到这个问题是专门针对SQL Server 2000提出的,但是我正在寻找以后版本的类似解决方案,并在SQL中发现了一些本机支持以实现这一目标。
在SQL Server 2012开始,请参见。 “ sp_describe_first_result_set”  -  to link tobol

我已经使用类似于上面的

@trisped's的技术实现了解决方案,并将其撕掉以实现本机SQL Server实现。

SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH FROM information_schema.columns WHERE TABLE_NAME = 'YOUR_TABLE_NAME'


26
投票

您可以每次执行查询时从头开始重新创建登台表吗?如果是这样,您可以使用

SELECT ... INTO

语法,让SQL Server担心使用正确的列类型等创建表。 SELECT * INTO your_staging_table FROM enormous_collection_of_views_tables_etc

这将为您提供与所有列属性相关的所有内容。 SELECT * INTO TMP1 FROM ( SELECT TOP 1 /* rest of your query expression here */ ); SELECT o.name AS obj_name, TYPE_NAME(c.user_type_id) AS type_name, c.* FROM sys.objects AS o JOIN sys.columns AS c ON o.object_id = c.object_id WHERE o.name = 'TMP1'; DROP TABLE TMP1;

select COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='yourTable';

SP_DESCRIDE_FIRST_RESULT_SET

16
投票
将通过分析查询第一个结果集的数据类型来帮助识别查询的数据类型。
Https://learn.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-describe-first-result-result-set-set-transact-sql- view = sql-server-2017


7
投票

我使用一个简单的案例语句来渲染我可以在技术规范文档中使用的结果。 此示例不包含您将使用数据库遇到的每个条件,但它为您提供了一个很好的模板。 SELECT TABLE_NAME AS 'Table Name', COLUMN_NAME AS 'Column Name', CASE WHEN DATA_TYPE LIKE '%char' THEN DATA_TYPE + '(' + CONVERT(VARCHAR, CHARACTER_MAXIMUM_LENGTH) + ')' WHEN DATA_TYPE IN ('bit', 'int', 'smallint', 'date') THEN DATA_TYPE WHEN DATA_TYPE = 'datetime' THEN DATA_TYPE + '(' + CONVERT(VARCHAR, DATETIME_PRECISION) + ')' WHEN DATA_TYPE = 'float' THEN DATA_TYPE WHEN DATA_TYPE IN ('numeric', 'money') THEN DATA_TYPE + '(' + CONVERT(VARCHAR, NUMERIC_PRECISION) + ', ' + CONVERT(VARCHAR, NUMERIC_PRECISION_RADIX) + ')' END AS 'Data Type', CASE WHEN IS_NULLABLE = 'NO' THEN 'NOT NULL' ELSE 'NULL' END AS 'PK/LK/NOT NULL' FROM INFORMATION_SCHEMA.COLUMNS ORDER BY TABLE_NAME, ORDINAL_POSITION

    

检查数据类型。 检查SQL Server数据库数据类型的第一种方法是使用SYS架构表的查询。以下查询使用列和类型表:
    SELECT C.NAME AS COLUMN_NAME,
       TYPE_NAME(C.USER_TYPE_ID) AS DATA_TYPE,
       C.IS_NULLABLE,
       C.MAX_LENGTH,
       C.PRECISION,
       C.SCALE
FROM SYS.COLUMNS C
JOIN SYS.TYPES T
     ON C.USER_TYPE_ID=T.USER_TYPE_ID
WHERE C.OBJECT_ID=OBJECT_ID('your_table_name');

6
投票
在这样,您可以找到列的数据类型。

此简单查询返回数据类型位。您可以将此thecnic用于其他数据类型:

3
投票
	
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.