我正在尝试在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中查询运行得很好
答案 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