如何从我的查询中返回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';