在SSIS中使用子查询会导致NULL值

时间:2014-01-07 16:29:16

标签: database-permissions

我正在尝试在SSIS中的OLE DB源连接器中执行一些SQL,这将获得有关数据库化的一些统计信息。

在SSIS中用于一台服务器时,此查询运行正常。然而,现在我循环遍历许多服务器和两列应该(并且曾经)生成int现在生成NULLS,数据类型为四字节有符号整数[DT_I4]。 这些是DataFileSizeMB和LogFileSizeMB。 我在这里完全失去了......(就像往常一样,转到这里,有点感觉就像失败一样;)

这是查询,为什么它不会在SSIS中运行并且它是否在SSMS中运行?

   SELECT       @@SERVERNAME as Server
                ,getdate() as Meetmoment
                ,name as Databasenaam
                ,(  SELECT CAST(ROUND(SUM(size), 0) AS float) AS Expr1
                    FROM  ( SELECT database_id, type, size * 8.0 / 1024 AS size  
                            FROM sys.master_files) AS fs_2
                    WHERE        (type = 0) AND (database_id = db.database_id)
                ) AS DataFileSizeMB
                ,(  SELECT CAST(ROUND(SUM(size), 0) AS float) AS Expr1
                    FROM (  SELECT database_id, type, size * 8.0 / 1024 AS size
                            FROM sys.master_files) AS fs_1
                     WHERE        (type = 1) AND (database_id = db.database_id)
                ) AS LogFileSizeMB
 FROM            sys.databases AS db
 ORDER BY DataFileSizeMB DESC

我将查询更改为

select @@SERVERNAME as Server, 
            getdate() as Meetmoment, 
            mdf.name as Databasename, 
            mdf.Size_MBs as  DataFileSizeMB, 
            ldf.Size_MBs as LogFileSizeMB 
FROM 

(SELECT d.name,
ROUND(SUM(mf.size) * 8 / 1024, 0) Size_MBs
FROM sys.master_files mf
INNER JOIN sys.databases d ON d.database_id = mf.database_id
where type = 0
GROUP BY d.name) as mdf 

LEFT JOIN

(SELECT d.name,
ROUND(SUM(mf.size) * 8 / 1024, 0) Size_MBs
FROM sys.master_files mf
INNER JOIN sys.databases d ON d.database_id = mf.database_id
where type = 1
GROUP BY d.name) as ldf on mdf.name = ldf.name

但是唉......它一定是别的............在哪里看?

据我所知,除了在计算过程中,这些列一直是整数。我尝试将所有相关列,输入和输出更改为浮点但没有区别。 已经在Query Builder中,结果fopr这些列为NULL,在SSMS中查询运行得很好

2 个答案:

答案 0 :(得分:1)

我的假设是您在与NULL的连接上遇到了权限问题。 - @billinkc 18小时前

好吧,开玩笑......这实际上就是......结果我使用的帐户可以访问SYS.DATABASES访问SYS.master_files。 ....

我有需要研究的内容;)

请参阅以下主题

我最终创建了一个脚本,该脚本创建了一个作业,该作业创建了一个表,该表将sys.master_files中的相关列插入到报表用户具有db_datareader的表中。这是我在SYS

中使用的查询中使用的表

答案 1 :(得分:0)

我重写了查询并避免了所有子查询:这个做了诀窍:

select     @@SERVERNAME as Server, 
            getdate() as Meetmoment, 
            sysdb.name as Databasename, 
            sum(datafile.Size* 8 / 1024) as  DataFileSizeMB, 
            sum(logfile.Size* 8 / 1024) as LogFileSizeMB 
FROM SYS.DATABASES (NOLOCK) sysdb 
        left join SYS.master_files datafile on sysdb.database_id = datafile.database_id and datafile.type = 0
        left join SYS.master_files logfile on sysdb.database_id = logfile.database_id and logfile.type = 1
group by sysdb.name