2010-04-01 59 views
3

给定一些任意的SQL我想获取返回列的数据类型。该声明可能会加入许多表,视图,TVF等。我知道我可以根据查询创建一个视图,并从中获取数据类型,希望有更快的方法。只能想到我已经能够想到正在编写一个.net实用程序来运行SQL并检查结果,想知道是否有TSQL答案。从SQL Server 2008中的任意sql语句中获取数据类型


文(不是真正的表只是一个例子)

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,not null)

等...

+0

@HLGEM我需要在数据集市中创建一些与源系统中某些查询的模式相匹配的表。 – 2010-04-01 22:10:21

回答

1
/*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 
+0

这很整齐,似乎很好。我注意到的唯一问题是,对于双字节字段(即nvarchar(255)变为nvarchar(510)),长度不正确,所以我刚刚为system_type_id IN(231,239)添加了另一个情况,其中我将长度除以2。 – 2010-04-02 16:03:29

+0

我会在本周末修复它。我很快把它扔在一起,所以希望它至少能给你一个很好的开始,你需要的东西 – 2010-04-02 18:44:53

+0

感谢苏格兰人,我刚刚添加下面并从第一个案件中删除231和239,所以它对我来说很好。 WHEN c.system_type_id IN(231239) THEN CASE WHEN c.max_length <> -1 THEN '(' + CAST(c.max_length/2为varchar(7))+ ')' ELSE“(最大) ' END – 2010-04-02 19:57:49

0

我试图达到这个目的,但它变得太难了。让我告诉我如何接近它。我使用了SQL解析器:http://www.sqlparser.com/download.php和C#。然后尝试分析文本。对于简单的查询它可以,但是很快它会被编译。关于视图的想法看起来更简单。

相关问题