【问题标题】:Invoking SMO via T-SQL?通过 T-SQL 调用 SMO?
【发布时间】:2011-10-06 13:39:21
【问题描述】:

我想使用 SMO 来完成一些在 T-SQL 中不容易完成的事情。但是,我发现的所有示例都是针对 C# 或 Powershell 的。有没有一种通过 T-SQL 调用 SMO 的简单方法,就像使用 DMO 和 sp_OACreate 一样?解决这个问题的一种方法是通过 PowerShell 通过xp_cmdshell 调用 SMO——但这会很难看。有什么建议吗?

最明显的例子是“使用 SMO 编写表的脚本”,通过 SQL 调用。

谢谢。

【问题讨论】:

  • 您具体要做什么?我敢打赌,它们在 T-SQL 中可能与在 SMO 中一样容易。
  • @siride 虽然一切都可以在直接的 T-SQL 中完成,但至少使用 SMO 编写对象脚本更容易一些。查看ScripterScriptingOptions
  • @srutzky:我用过它们,它们(大部分)都很棒。不过,我想知道,您是否应该只编写一个 C# 工具来执行此操作?有什么理由必须通过 T-SQL 来完成?
  • @siride 同意,这当然是一个很好/有效的问题。
  • @srutzky 这比 PowerShell 脚本有什么优势?我必须在 SQL Server 引擎之外调用两者。试图通过 T-SQL 来完成,因为我已经通过 DMO 这样做了。诚然,5 年前的问题,但我最终是通过 PowerShell 完成的。

标签: sql-server tsql sqlclr smo


【解决方案1】:

很遗憾,SMO 不能通过 SQLCLR 直接调用。不仅 -- Microsoft.SqlServer.Smo.dll -- 不在 Supported .NET Framework Libraries 列表中,而且明确禁止使用。

如果您尝试通过 CREATE ASSEMBLY 手动导入该 DLL,则会收到以下错误:

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 行
执行用户定义的例程或聚合“SmoTest”期间发生 .NET Framework 错误:
System.Security.SecurityException:该程序集不允许部分受信任的调用者。

如果您的程序集标有PERMISSION_SET = UNSAFE,您会得到:

消息 6522,第 16 级,状态 2,第 1 行
执行用户定义的例程或聚合“SmoTest”期间发生 .NET Framework 错误:
System.Exception: 此功能在 SQLCLR 中被禁用。建议您从客户端应用程序执行。
系统异常:
在 Microsoft.SqlServer.Management.Common.ConnectionManager..ctor()
在 Microsoft.SqlServer.Management.Smo.Server..ctor()

更新:

而且,我刚刚在 MSDN 论坛上找到了 2007 年 1 月的相关主题:

'microsoft.sqlserver.batchparser' is malformed or not a pure .NET assembly.

【讨论】:

  • 您是否尝试过反编译程序集,在 VS 中重新编译成一组新程序集,然后通过 SQLCLR 运行它?我只是觉得你走得还不够远。
  • @siride 好的,所以我只是尝试(一点)并通过ILSpy 获得了源代码,但只是没有时间更新所有命名空间引用和/或其他任何需要的东西.哦,好吧,也许你有时间试试? ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-18
  • 2010-12-13
  • 1970-01-01
  • 2020-06-10
  • 1970-01-01
  • 2023-03-27
  • 2016-12-17
相关资源
最近更新 更多