Вызов SMO через T-SQL? - PullRequest
       39

Вызов SMO через T-SQL?

2 голосов
/ 06 октября 2011

Я хотел бы использовать SMO, чтобы сделать несколько вещей, которые нелегко сделать в T-SQL. Тем не менее, все примеры, которые я нашел, относятся к C # или Powershell. Есть ли простой способ вызвать SMO через T-SQL, как вы могли бы сделать с DMO и sp_OACreate? Один из способов обойти это - вызвать SMO через PowerShell через xp_cmdshell - но это будет ужасно. Предложения?

Очевидным примером будет «сценарий таблицы с использованием SMO», вызываемый через SQL.

Спасибо.

1 Ответ

3 голосов
/ 14 марта 2015

К сожалению, нет, 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.

...