如何从我的查询中返回SQL数据types?

我有一个SQL查询,查询一个巨大的数据库(如在数百个与难看的名字,如CMM-CPP-FAP-ADD)的数据库,我不需要也不想理解。 此查询的结果需要存储在登台表中以提供报告。

我需要创build登台表,但有数百个视图/表来挖掘,以find在这里表示的数据types,我不知道是否有更好的方法来构造这个表。

任何人都可以build议我将如何使用任何SQL Server 2008工具来在我的SQL 2000数据库中的源数据types的神圣?

作为一个通用的例子,我想从一个像这样的查询中知道:

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 

我对约束不感兴趣,我只是想知道数据types。

 select * from information_schema.columns 

可以让你开始。

您也可以将结果(或前10个结果)插入到临时表中,并从临时表中获取列(只要列名是不同的)。

 SELECT TOP 10 * INTO #TempTable FROM <DataSource> 

然后使用:

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

要么

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

从这里推论出亚伦的回答 。

你也可以使用…

 SQL_VARIANT_PROPERTY() 

…在没有直接访问元数据的情况下(例如,可能是链接服务器查询?)。

http://msdn.microsoft.com/en-us/library/ms178550.aspx

在SQL Server 2005及更高版本中,最好使用目录视图(sys.columns)而不是INFORMATION_SCHEMA。 除非移植到其他平台是重要的。 请记住,INFORMATION_SCHEMA视图不会改变,所以在SQL Server的连续版本中,它们将逐渐缺乏关于新特性等方面的信息。

必须有更容易的方法来做到这一点…低,看,有…!

sp_describe_first_result_set ”是你的朋友!

现在我意识到这个问题是专门针对SQL Server 2000问的,但是我正在为更高版本寻找类似的解决scheme,并在SQL中发现了一些本机支持来实现这一点。

在SQL Server 2012中起作用 “sp_describe_first_result_set” – 链接到BOL

我已经使用类似于上面的@ Trisped的技术实现了一个解决scheme,并将其剥离出来以实现本机SQL Server实现。

如果你还没有使用SQL Server 2012或Azure SQL数据库,下面是我为2012年以前的数据库创build的存储过程:

 CREATE PROCEDURE [fn].[GetQueryResultMetadata] @queryText VARCHAR(MAX) AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. --SET NOCOUNT ON; PRINT @queryText; DECLARE @sqlToExec NVARCHAR(MAX) = 'SELECT TOP 1 * INTO #QueryMetadata FROM (' + @queryText + ') T;' + ' SELECT C.Name [ColumnName], TP.Name [ColumnType], C.max_length [MaxLength], C.[precision] [Precision], C.[scale] [Scale], C.[is_nullable] IsNullable FROM tempdb.sys.columns C INNER JOIN tempdb.sys.types TP ON TP.system_type_id = C.system_type_id AND -- exclude custom types TP.system_type_id = TP.user_type_id WHERE [object_id] = OBJECT_ID(N''tempdb..#QueryMetadata''); ' EXEC sp_executesql @sqlToExec END 

每当执行查询时,您是否可以从头开始重新创build登台表? 如果是这样,您可以使用SELECT ... INTO语法,并让SQL Server使用正确的列types等来创build表。

 SELECT * INTO your_staging_table FROM enormous_collection_of_views_tables_etc 
 SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH FROM information_schema.columns WHERE TABLE_NAME = 'YOUR_TABLE_NAME' 

你可以使用列别名来获得更好的输出。

这会给你一切相关的列属性。

 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; 

对于SQL Server 2012及更高版本:如果将查询放入string中,则可以像下面这样获取结果集数据types:

 DECLARE @query nvarchar(max) = 'select 12.1 / 10.1 AS [Column1]'; EXEC sp_describe_first_result_set @query, null, 0; 
 select COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='yourTable';