2009-10-21 59 views
42

我有一个SQL查询,查询一个巨大的(如,数百意见/表与像难以阅读的名字CMM-CPP-FAP-ADD),我不需要也不想要了解数据库。此查询的结果需要存储在登台表中以提供报告。如何从我的查询中返回SQL数据类型?

我需要创建登台表,但有数百个视图/表来挖掘以找到在这里表示的数据类型,我不得不怀疑是否有更好的方法来构造此表。

谁能劝我怎么会使用任何的SQL Server 2008和工具就可以洞察到在我的SQL 2000数据库的源数据类型?

比如一个,我想从一个查询就知道这样的:

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 

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

回答

46
select * from information_schema.columns 

可以让你开始。

+0

无效的对象名称INFORMATION_SCHEMA.COLUMNS“ – JMP

+3

待办事项你有一个CASE SENSITIVE数据库?如果是这样,你必须使用'SELECT * FROM INFORMATION_SCHEMA.Columns' –

+1

是的,它是区分大小写的。我试着SELECT * FROM INFORMATION_SCHEMA.Columns并得到相同的无效对象错误。这是SQL Server 2000(8.0.2055),此版本中是否存在INFORMATION_SCHEMA? – JMP

5

你可以逃脱从头每次执行查询时重新创建临时表?如果是这样,你可以使用SELECT ... INTO语法,让SQL Server的担心使用正确的列类型等

SELECT * 
INTO your_staging_table 
FROM enormous_collection_of_views_tables_etc 
+0

不幸的是不是一个选项。 – JMP

+0

他也可以使用erikkallen指向的information_schema表创建该登台表以获取列数据类型。 – Spidey

+5

@JM:如何将'SELECT ... INTO ... FROM ... WHERE 1 = 0'语法作为一次性运行来创建一个虚拟表,然后使用Management Studio将脚本创建SQL脚本虚拟桌子? – LukeH

16

您也可以使用创建表...

SQL_VARIANT_PROPERTY() 

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

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

在SQL Server 2005及以后,你最好使用相对于INFORMATION_SCHEMA目录视图(SYS.COLUMNS)。除非移植到其他平台很重要。请记住,INFORMATION_SCHEMA视图不会更改,因此它们将逐渐缺乏有关SQL Server连续版本中新功能等的信息。

+0

这不适用于文本字段。将抛出此异常:“操作数类型冲突:文字是SQL_VARIANT不兼容” – eflles

+1

@eflles谢谢,请记住这是一个特殊的情况下(当你没有访问元数据),甚至在2009年时这个问题上来,你应该放弃'text','ntext'和'image'。如果今天人们仍在使用这些,这只是他们问题的一小部分...... –

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

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

SELECT TOP 10 * 
INTO #TempTable 
FROM <DataSource> 

然后使用:从Aaron's answer here外推

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

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

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

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

8

There 必须是更简单的方法来做到这一点......低,瞧,有......!

sp_describe_first_result_set”是你的朋友!

现在我的确意识到这个问题是专门为SQL Server 2000的要求,但我一直在寻找更高版本类似的解决方案,并发现了一些SQL原生支持来实现这一目标。

在SQL Server 2012年起参“sp_describe_first_result_set” - Link to BOL

我已经使用类似于@Trisped's以上的技术已经实现了一个解决方案,撕开它来实现本机的SQL Server实现。

如果你没有的SQL Server 2012或SQL Azure的数据库上的是,这里的存储过程我对2012年革命前的数据库创建:

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 
1

这会给你一切列属性有关。

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; 
2

对于SQL Server 2012及以上:如果将查询到的字符串,那么你可以得到这样的结果集数据类型,因此:

DECLARE @query nvarchar(max) = 'select 12.1/10.1 AS [Column1]'; 
EXEC sp_describe_first_result_set @query, null, 0; 
相关问题