К сожалению, нет, SMO не может напрямую вызываться через SQLCLR. Он не только - Microsoft.SqlServer.Smo.dll - отсутствует в списке Поддерживаемых библиотек .NET Framework , но и специально запрещен.
Если вы попытаетесь вручную импортировать эту DLL через CREATE ASSEMBLY
, вы получите следующую ошибку:
CREATE ASSEMBLY [SMO]
AUTHORIZATION [dbo]
FROM
N'C:\Program Files\Microsoft SQL Server\110\SDK\Assemblies\Microsoft.SqlServer.Smo.dll'
WITH PERMISSION_SET = UNSAFE;
Возвращает:
Сообщение 6596, Уровень 16, Состояние 1, Строка 1
Не удалось создать CREATE ASSEMBLY, поскольку сборка «Microsoft.SqlServer.Smo» является сборкой системы. Попробуйте создать пользовательскую сборку, чтобы обернуть нужные функции.
Хорошо, поэтому попробуйте "создать пользовательскую сборку, чтобы обернуть нужные функции".
Если ваша сборка помечена PERMISSION_SET = SAFE
, вы получите:
Сообщение 6522, Уровень 16, Состояние 2, Строка 1
Ошибка .NET Framework во время выполнения пользовательской подпрограммы или агрегата «SmoTest»:
System.Security.SecurityException: Эта сборка не допускает частично доверенных вызывающих абонентов.
Если ваша сборка помечена PERMISSION_SET = UNSAFE
, вы получите:
Сообщение 6522, Уровень 16, Состояние 2, Строка 1
Ошибка .NET Framework во время выполнения пользовательской подпрограммы или агрегата «SmoTest»:
System.Exception: Эта функция отключена в SQLCLR. Рекомендуется выполнить из вашего клиентского приложения.
System.Exception:
в Microsoft.SqlServer.Management.Common.ConnectionManager..ctor ()
в Microsoft.SqlServer.Management.Smo.Server..ctor ()
UPDATE:
И я только что нашел эту связанную ветку с января 2007 года на форумах MSDN:
'microsoft.sqlserver.batchparser' поврежден или не является чистой сборкой .NET.