Что делать когда возможностей и функционала SQL сервера не хватает ?
Представим что нужно получить размер свободного пространства на всех дисках.
Тогда на помощь придет OLE автоматизация, которая является одной из самых полезных возможностей SQL сервера, доступная еще с 2005 версии.
Как же эти воспользоваться, для начала нужно включить эту опцию на SQL сервере
--включить интеграцию с OLE
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Ole Automation Procedures', 1;
GO
RECONFIGURE;
GO
Затем воспользоваться следующими процедурами:
При обращении к объекту OLE-автоматизации из Transact-SQL сперва необходимо вызвать системную хранимую процедуру sp_OACreate,
которая создает экземпляр объекта в адресном пространстве экземпляра компонента Компонент Database Engine.
После создания экземпляра объекта можно вызывать следующие хранимые процедуры для работы со свойствами,
методами и получением сведений об ошибках, связанных с созданным объектом.
sp_OAGetProperty - возвращает значение свойства, sp_OAGetProperty - устанавливает значение свойства, sp_OAMethod - вызывает метод,
sp_OAGetErrorInfo - возвращает сведения о последней возникшей ошибке
Когда объект больше не нужен, вызов хранимой процедуры sp_OADestroy позволяет освободить память, удалив объект, созданный хранимой процедурой sp_OACreate.
Создаем процедуру, в которой подсчитаем размер свободного пространства на диске
Запускаем нашу процедуру и видим что все работает
declare @TotalSpace float
, @FreeSpace float
, @Dif float
, @DrivePath varchar(1000)
SET @DrivePath = 'C:'
exec dbo.DriveSpace
@DrivePath
,
@TotalSpace = @TotalSpace out
,@FreeSpace = @FreeSpace out
select @DrivePath Drivepath ,@FreeSpace/@TotalSpace*100 PCT_free, @FreeSpace FreeSpace, @TotalSpace TotalSpace
Поскольку синтаксис SP_OACREATE нельзя признать самым удобным для написания сложных конструкций и их отладки,
то рекомендуется вначале проверять работоспособность программных объектов, доступность их свойств и методов при помощи более специализированных средств например power shell.