如何从我的查询返回的SQL数据类型?(How do I return the SQL data ty

2019-08-31 06:11发布

我有一个SQL查询,查询一个巨大的(如,数百意见/表与像难以阅读的名字CMM-CPP-FAP-ADD),我不需要也不想要了解数据库。 此查询的结果需要被存储在一个临时表来养活的报告。

我需要创建临时表,但有数百意见/表来挖通找到正在这里表示的数据类型,我想知道是否有更好的方法来构建该表。

任何人都可以告诉我怎么会使用任何的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

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

Answer 1:

select * from information_schema.columns

可以让你开始。



Answer 2:

你也可以插入结果(或前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');

从外推亚伦的答案在这里 。



Answer 3:

您还可以使用...

SQL_VARIANT_PROPERTY()

...在情况下,你不必对元数据的直接访问(如链接的服务器查询吧?)。

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

在SQL Server 2005及以后,你最好使用相对于INFORMATION_SCHEMA目录视图(SYS.COLUMNS)。 除非移植到其他平台上是非常重要的。 只要记住的是,INFORMATION_SCHEMA视图不会改变,所以他们将逐渐缺乏新功能等信息在SQL Server的后续版本。



Answer 4:

必须有连接更简单的方法来做到这一点...低不料,有...!

“sp_describe_first_result_set”是你的朋友!

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

在SQL Server 2012年起参 “sp_describe_first_result_set” - 链接到BOL

我一直在使用类似的技术已经实施的解决方案@ Trisped是上面撕下它来实现本机的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


Answer 5:

对于SQL Server 2012及以上:如果将查询到的字符串,然后就可以得到结果集的数据类型,如下所示:

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


Answer 6:

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

您可以使用列别名更好看输出。



Answer 7:

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

SELECT *
INTO your_staging_table
FROM enormous_collection_of_views_tables_etc


Answer 8:

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


Answer 9:

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

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;


Answer 10:

sp_describe_first_result_set

将有助于分析和查询的前结果集的数据类型来识别查询的数据类型

https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-describe-first-result-set-transact-sql?view=sql-server-2017



Answer 11:

我用一个简单的case语句来呈现结果,我可以在技术规范文档中使用。 这个例子不包含你会碰到与数据库中的每个条件,但它给你一个很好的模板一起工作。

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


文章来源: How do I return the SQL data types from my query?