Как я могу преобразовать операцию EXEC в переменную таблицы для дальнейшего SELECT? - PullRequest
0 голосов
/ 13 июля 2009

У меня следующий запрос, который я запускаю через SQLCMD.EXE

use [AxDWH_Central_Reporting]
GO
EXEC sp_spaceused @updateusage = N'TRUE'
GO

Это возвращает 2 таблицы ... и выходной файл uglu со следующим содержанием:

Changed database context to 'AxDWH_Central_Reporting'.

database_name                                                                                                                   Pdatabase_size     Punallocated space 
--------------------------------------------------------------------------------------------------------------------------------P------------------P------------------
AxDWH_Central_Reporting                                                                                                         P10485.69 MB       P7436.85 MB        
reserved          Pdata              Pindex_size        Punused            
------------------P------------------P------------------P------------------
3121176 KB        P3111728 KB        P7744 KB           P1704 KB           
----------------------------------------------------------------

Можно ли сделать его короче? Точно мне нужны только значения database_name и database_size .. Я пробовал SQL-запросы вроде

SELECT database_name, database_size FROM (EXEC sp_spaceused @updateusage = N'TRUE') AS tbl1 

но это не работает.

Ответы [ 4 ]

2 голосов
/ 13 июля 2009

sp_spaceused - системная хранимая процедура. Вы можете просмотреть исходный код в студии управления в основной базе данных. Скопируйте код в свою собственную процедуру, измените его так, чтобы он возвращал только то, что вам нужно.

0 голосов
/ 14 июля 2009

Я открыл системную хранимую процедуру sp_spaceused и сделал SELECT, которые мне нужны:)

declare
    @dbname sysname,
    @dbsize bigint,
    @logsize bigint,
    @reservedpages  bigint

select
    @reservedpages = sum(a.total_pages)
from 
    sys.partitions p join sys.allocation_units a on p.partition_id = a.container_id left join sys.internal_tables it on p.object_id = it.object_id

select
    @dbsize = sum(convert(bigint,case when status & 64 = 0 then size else 0 end)),
    @logsize = sum(convert(bigint,case when status & 64 <> 0 then size else 0 end))
from 
    dbo.sysfiles

select 
    'database name' = db_name(),
    'database size' = ltrim(str((convert (dec (15,2),@dbsize) + convert (dec (15,2),@logsize)) * 8192 / 1048576,15,2) + ' MB'),
    'unallocated space' = ltrim(str((case when @dbsize >= @reservedpages then
        (convert (dec (15,2),@dbsize) - convert (dec (15,2),@reservedpages)) * 8192 / 1048576 else 0 end),15,2) + ' MB')
0 голосов
/ 13 июля 2009

Если вам нужно использовать хранимую процедуру, вы можете вставить ее в табличную переменную, а затем сделать выбор, чтобы получить только ту информацию, которая вам нужна.

Другой вариант, если у вас есть контроль над хранимой процедурой, это передать параметр select, как я покажу ниже. Если вы не можете сделать то, что я назвал @SelectClause, то, вставив в таблицу, вы можете сделать простой выбор.

INSERT INTO @atttable (RowID, Name, ID, AttributePosition, AVTable, KeyField, EntityNameField, Virtual, DataType, AttributeListName, AttributeRequired, AttributeUnique) 
    EXEC [dbo].[SomeStoredProcedure] 
    @SelectClause='ROW_NUMBER() OVER(ORDER BY AttributePosition) RowID, AttributeName, AttributeID, AttributePosition, EntityAVTableName, EntityKeyField, EntityNameField, Virtual, AttributeDataType, AttributeListName, AttributeRequired, AttributeUnique', 
    @WhereClause=@EntityWhereClause
0 голосов
/ 13 июля 2009

Преобразование вашего сохраненного процесса в Табличную пользовательскую функцию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...