sql - 从SQL Server 2008中的任意sql语句获取数据类型

给定一些任意的SQL,我想获取返回列的数据类型。该语句可能会连接许多表, View ,TVF等。我知道我可以根据查询创建一个 View 并从中获取数据类型,希望有一种更快的方法。只想到我已经想到编写一个.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

我想要一些类似的东西

PersonName:(nvarchar(255),不为null)

年龄:(smallInt,不为null)

等等...

最佳答案

    /*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

https://stackoverflow.com/questions/2562521/

相关文章:

user-interface - WiX安装程序-更新方案自定义UI

sharepoint - WebEx WebOffice的开源替代品?

apache-flex - 我们可以将系统图标添加到flex应用程序中吗

apache-flex - 使用 AS3 放大和缩小

user-interface - Netbeans 6.8 上的功能测试

excel - 从工作表调用的 Excel VBA UDF 是否可以传递除 'Range' 以外的任

directx - 如何为游戏关卡编辑器实现平移和旋转小部件

.net - SimpleWorkerRequest 如何将 MIME 类型与扩展关联?

codeigniter - 我应该如何处理我的多对多关系?

plugins - 原型(prototype)/脚本循环(幻灯片)插件