2016-02-10 5 views
0

Я пытаюсь понять, почему переменная обрабатывается по-разному, когда она передается в подзапросе в выражении «if», но отлично работает при выполнении независимо.Передача переменной в db_id()

Успешный один

select db_id((Select name from sys.databases where database_id > 4)) 

Результат:

DBSIZE 
-------- 
5 

Где она возвращает Null:

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' 

Результат:

DBSize 
--------- 
NULL 

ответ

1

FILEPROPERTY вызов возвращается нуль, потому что:

FileProperty (Transact-SQL)

Возвращает заданное имя файла значение свойства, если имя файла в текущей базе данных и имя свойства указаны. Возвращает NULL для файлов, отсутствующих в текущей базе данных.

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

Вы должны use базы данных перед вызовом FILEPROPERTY, так что вам нужно будет построить некоторые динамический SQL, к сожалению.

+0

Я вроде бы шел к этому направлению. Спасибо за вашу помощь –

Смежные вопросы