我试图弄清楚为什么在" if语句"中的子查询中传递变量时会有不同的处理方式。但独立执行时效果很好。
成功的
cls
结果:
select db_id(( Select name from sys.databases where database_id > 4))
返回Null:
DBSIZE
--------
5
结果:
Declare @dbcount int;
set @dbcount = (Select count(*) from sys.databases where database_id > 4);
If @dbcount = 1
Begin
select usedspace as 'DBSize'
from
(
SELECT (s.size * CONVERT(float,8))/1024 AS [Size],
(CAST(CASE s.type WHEN 2 THEN 0 ELSE CAST(FILEPROPERTY(s.name, 'SpaceUsed') AS float)* CONVERT(float,8) END AS float))/1024 AS [UsedSpace],
s.file_id AS [ID]
FROM
sys.filegroups AS g
INNER JOIN sys.master_files AS s ON ((s.type = 2 or s.type = 0) and s.database_id = db_id((Select name from sys.databases where database_id > 4)) and (s.drop_lsn IS NULL)) AND (s.data_space_id=g.data_space_id)
) DBFileSizeInfo
End
else
Print 'The instance has more than 1 database'
答案 0 :(得分:1)
FILEPROPERTY
调用返回null,因为:
FILEPROPERTY(Transact-SQL)
当指定当前数据库中的文件名和属性名时,返回指定的文件名属性值。 为不在当前数据库中的文件返回NULL。
https://technet.microsoft.com/en-us/library/ms188401.aspx
在调用use
之前,您需要FILEPROPERTY
数据库,所以不幸的是,您需要构建一些动态SQL。