在db_id()中传递变量

时间:2016-02-10 00:19:58

标签: sql sql-server

我试图弄清楚为什么在" 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'

1 个答案:

答案 0 :(得分:1)

FILEPROPERTY调用返回null,因为:

  

FILEPROPERTY(Transact-SQL)

     

当指定当前数据库中的文件名和属性名时,返回指定的文件名属性值。 为不在当前数据库中的文件返回NULL。

https://technet.microsoft.com/en-us/library/ms188401.aspx

在调用use之前,您需要FILEPROPERTY数据库,所以不幸的是,您需要构建一些动态SQL。