代码之家  ›  专栏  ›  技术社区  ›  Christoph Jonathan

从SQLServer2008中的任意sql语句获取数据类型

  •  3
  • Christoph Jonathan  · 技术社区  · 16 年前

    给定一些任意的SQL,我想得到返回列的数据类型。语句可能会连接许多表、视图、tvf等。我知道我可以基于查询创建一个视图,并从中获取数据类型,希望有一种更快的方法。我唯一能想到的就是编写一个.net实用程序来运行SQL并检查结果,想知道是否有TSQL的答案。


    即

    SELECT p.Name AS PersonName, p.Age, a.Account as AccountName
    FROM Person as p
    LEFT JOIN Account as a
        ON p.Id = a.OwnerId
    

    我想要一些

    人名:(nvarchar(255),不为空)

    年龄:(smallInt,不为空)

    等。。。

    2 回复  |  直到 16 年前
        1
  •  1
  •   Scot Hauder    16 年前
        /*you may have to alias some columns if they are not unique*/
        /*EDIT: added fix for 2byte nchar/nvarchar */
        SELECT top (1)  /*<your query columns here>*/ 
        INTO #tmp99
        /*<rest of your query here>*/
    
    
        SELECT 'CREATE TABLE [tablename]('  UNION ALL 
        SELECT CASE WHEN ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) = 1 THEN '' ELSE ',' END 
        + CHAR(13) + '[' + c.name + '] [' + t.name + ']' 
        + CASE WHEN c.system_type_id IN (165,167,173,175) 
               THEN CASE WHEN c.max_length <> -1
                         THEN '(' + CAST(c.max_length AS varchar(7)) + ')' 
                         ELSE '(max)' 
                         END 
               WHEN c.system_type_id IN (231,239) 
               THEN CASE WHEN c.max_length <> -1 
                         THEN '(' + CAST(c.max_length/2 AS varchar(7)) + ')' 
                         ELSE '(max)' END
               ELSE 
                   CASE WHEN c.system_type_id IN (41,42,43) 
                        THEN '(' + CAST(c.scale AS varchar(7)) + ')'
                        ELSE
                            CASE WHEN c.system_type_id IN (106,108) 
                                 THEN '(' + CAST(c.precisiON AS varchar(7)) + ',' + CAST(c.scale AS varchar(7)) + ')'
                                 ELSE ''
                                 END 
                        END
               END
    
        + CASE WHEN c.is_nullable = 1 THEN ' NULL' ELSE ' NOT NULL' END 
    
        FROM tempdb.sys.columns c
        JOIN tempdb..sysobjects o ON (c.object_id = o.id)
        JOIN tempdb.sys.types t ON (t.user_type_id = c.user_type_id)
        WHERE o.name LIKE '#tmp99%' 
        UNION ALL SELECT ')' 
        FOR XML PATH('')
    
        DROP TABLE #tmp99
    
        2
  •  0
  •   Andrey    16 年前

    我试图达到这个目的,但结果太难了。让我告诉你我是怎么接近它的。我选择了SQL解析器: http://www.sqlparser.com/download.php

    推荐文章