代码之家  ›  专栏  ›  技术社区  ›  JMP

如何从查询返回SQL数据类型?

  •  51
  • JMP  · 技术社区  · 16 年前

    我需要创建staging表,但是由于要挖掘数百个视图/表来查找此处所表示的数据类型,我不得不怀疑是否有更好的方法来构建此表。

    有人能告诉我如何使用SQLServer2008工具来预测我的SQLServer2000数据库中的源数据类型吗?

    作为一般示例,我想通过以下查询了解:

    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
    

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

    10 回复  |  直到 16 年前
        1
  •  64
  •   erikkallen    16 年前
    select * from information_schema.columns
    

    我可以帮你开始。

        2
  •  52
  •   redcalx    8 年前

    对于SQL Server 2012及更高版本:如果将查询放入字符串中,则可以获得如下结果集数据类型:

    DECLARE @query nvarchar(max) = 'select 12.1 / 10.1 AS [Column1]';
    EXEC sp_describe_first_result_set @query, null, 0;  
    
        3
  •  34
  •   Community Mohan Dere    9 年前

    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');
    

    根据 Aaron's answer here .

        4
  •  31
  •   Aaron Bertrand    5 年前

    SQL_VARIANT_PROPERTY()
    

    …如果您无法直接访问元数据(例如,可能是链接服务器查询?)。

        5
  •  22
  •   Trisped    9 年前

    那里 必须 这是一种更简单的方法。。。低,看,有。。。!

    “他是你的朋友!

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

    Link to BOL

    我已经使用类似于的技术实现了一个解决方案 @Trisped's 并将其拆下以实现本机SQL Server实现。

    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
    
        6
  •  11
  •   bummi Haisum Usman    11 年前
    SELECT COLUMN_NAME,
           DATA_TYPE,
           CHARACTER_MAXIMUM_LENGTH
    FROM information_schema.columns
    WHERE TABLE_NAME = 'YOUR_TABLE_NAME'
    

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

        7
  •  6
  •   LukeH    16 年前

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

    SELECT *
    INTO your_staging_table
    FROM enormous_collection_of_views_tables_etc
    
        8
  •  5
  •   user2074102 user2074102    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;
    
        9
  •  2
  •   Alias Varghese    7 年前

    sp\u描述\u第一个\u结果集\u

    将通过分析查询的第一个结果集的数据类型来帮助识别查询的数据类型

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

        10
  •  2
  •   rsidebot    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
    
        11
  •  1
  •   bummi Haisum Usman    11 年前
    select COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH 
    from INFORMATION_SCHEMA.COLUMNS 
    where TABLE_NAME='yourTable';
    
        12
  •  0
  •   R.Alonso    6 年前

    这个简单的查询返回一个数据类型位。您可以将此NIC用于其他数据类型:

        13
  •  0
  •   Amankhani MohammadJavad    5 年前

    检查数据类型。 检查SQL Server数据库数据类型的第一种方法是使用SYS schema表进行查询。以下查询使用列和类型表:

        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');