如何在SQL Server中动态选择表和列?

时间:2015-07-16 10:07:59

标签: sql sql-server procedure

我试图在SQL code中创建SQL Server,动态选择特定数据库中的所有表,然后为每个表中的每一列计算缺失值和非空值的数量。我也希望将此结果插入到另一个表中。

如果不手动更改每个列的名称,我有什么方法可以做到这一点:

Table Name - Column selection

我有一个teradata代码,我尝试将其转换为SQL Server code。但是我无法正确地获得动态分配和插入部分。

insert into temp
values (select  ''CAMP'',
    rtrim(''' || tablename || '''),
    rtrim(''' || columnname || '''),
    rtrim(''' || columnformat || '''),
    count(1),
    count(rtrim(upper(case when ' || columnname || '='''' then NULL else '|| columnname ||' end))),
    (cast (count(rtrim(upper(case when  ' || columnname || '='''' then NULL else  ' || columnname || ' end))) as float) / (cast (count(1) as float))) * 100,
    count(distinct rtrim(upper(case when ' || columnname || '='''' then NULL else '|| columnname ||' end))),
    min(rtrim(upper(case when ' || columnname || '='''' then NULL else '|| columnname ||' end))),
    max(rtrim(upper(case when ' || columnname || '='''' then NULL else '|| columnname ||' end))),
    min(len(rtrim(upper(case when ' || columnname || '='''' then NULL else '|| columnname ||' end)))),
    max(len(rtrim(upper(case when ' || columnname || '='''' then NULL else '|| columnname ||' end))))
from    ' || tablename ||')

这方面的任何帮助都会很棒! 谢谢!

2 个答案:

答案 0 :(得分:1)

不确定您是否需要UNIONJOIN,但在任何一种情况下,如果您使用的是多数据库,则可以在另一个数据库中使用由三部分组成的名称:

USE database1; // Your database name
GO
CREATE VIEW dbo.MyView
AS
    SELECT columns FROM dbo.Table1
    UNION ALL
    SELECT columns FROM database2.dbo.Table2; //second database
GO

select * from dbo.MyView // Getting all data from view

希望有所帮助

答案 1 :(得分:0)

这样的事情可以帮到你:

    SELECT  [Table] = t.[name]
        , [Column] = c.[name]
    FROM    sys.tables t
    INNER   JOIN    sys.columns c
        ON  c.[object_id] = t.[object_id]