Когда-нибудь вам приходилось проверять заголовки и содержимое резервных копий внутри TSQL? Если да, то вы, возможно, столкнулись с методом использования (временной) таблицы и синтаксиса “insert … exec”. Хотя этот метод работает, он может сделать ваш код беспорядочным и увеличить размер вашей хранимой процедуры.
В этом блоге мы рассмотрим альтернативное решение, используя SQLCLR и функции, определенные пользователем (UDF) со значением таблицы, для получения сведений о резервном файле.
Функции со значением таблицы в SQLCLR
Функции со значением таблицы в SQLCLR позволяют возвращать таблицу в качестве результата функции. Это может быть более элегантное решение по сравнению с использованием временных таблиц. Однако одной из проблем является получение вывода команды “restore headeronly” изнутри UDF.
Выполнение динамического SQL не поддерживается в SQLCLR, и для этой задачи нет доступных расширенных процедур. Одно из возможных решений – использовать объекты управления SQL Server (SMO) для получения содержимого резервной копии из файла в .NET.
Использование SMO в SQLCLR
Использование SMO в SQLCLR требует некоторой настройки. Сначала вам нужно загрузить и установить SMO на вашем компьютере. Убедитесь, что вы выбрали соответствующий установщик на основе архитектуры вашего компьютера.
Затем добавьте ссылки на необходимые сборки SMO в ваш проект. Они включают Microsoft.SQLServer.SMO, Microsoft.SqlServer.Management.Sdk.Sfc, Microsoft.SqlServer.ConnectionInfo и Microsoft.SqlServer.SmoExtended.
После настройки ссылок вы можете начать писать вашу SQLCLR функцию. Имейте в виду, что вам придется много печатать, особенно если ваша функция возвращает много столбцов. Вам нужно будет определить столбцы в атрибуте TableDefinition, создать выходные параметры для каждого столбца и присвоить значения этим параметрам.
Создание функции
Создание SQLCLR функции включает несколько шагов. Сначала убедитесь, что вы правильно сопоставили типы данных для ваших столбцов. Если вам нужно внести изменения, требующие удаления и повторного создания сборки, не забудьте сначала удалить все объекты, ссылающиеся на сборку.
Затем обратите внимание на пространство имен для вашей функции. Хорошей практикой является использование осмысленной структуры пространства имен для организации вашего кода. Например, вы можете использовать пространство имен “CompanyName.SQLCLR.DBA” для функции, связанной с задачами администрирования базы данных.
Наконец, создайте функцию в желаемом пространстве имен в вашей базе данных библиотеки. Вы можете дать ей имя, отражающее ее назначение, например “DBA.backup_file_headers”.
Вывод
Использование SQLCLR и функций со значением таблицы может предоставить более чистый и эффективный способ получения сведений о резервном файле в SQL Server. Используя SMO, вы можете получить доступ к содержимому резервной копии из .NET, избавившись от необходимости в беспорядочном коде и временных таблицах.
Хотя для этого требуется некоторая настройка, преимущества использования SQLCLR и функций со значением таблицы перевешивают начальные усилия. Попробуйте и посмотрите, как это может улучшить ваши процессы резервного копирования и восстановления.