2011-10-06 61 views
2

我想用SMO去做几件在T-SQL中不容易做的事情。但是,我发现的所有示例都是针对C#或Powershell的。有没有简单的方法通过T-SQL调用SMO,就像你可以用DMO和sp_OACreate一样?其中一种方法是通过xp_cmdshell通过PowerShell调用SMO - 但这会很糟糕。建议?通过T-SQL调用SMO?

一个明显的例子是“通过SMO调用表格”。

谢谢。

+0

你想做什么事情,具体是?我敢打赌,他们可能在SMO中很容易在T-SQL中完成。 – siride

+0

@siride虽然所有的东西都可以在直接的T-SQL中完成,但使用SMO至少可以让脚本对象更容易一些。查看[Scripter](https://msdn.microsoft.com/zh-CN/library/microsoft.sqlserver.management.smo.scripter.aspx)和[ScriptingOptions](https://msdn.microsoft.com/zh-cn/ -us /库/ microsoft.sqlserver.management.smo.scriptingoptions.aspx)。 –

+1

@srutzky:我用过这些,他们(大部分)都很棒。不过,我想知道,如果你应该写一个C#工具来做到这一点?任何必须通过T-SQL完成的原因? – siride

回答

3

不幸的是,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; 

返回:

Msg 6596, Level 16, State 1, Line 1
CREATE ASSEMBLY failed because assembly 'Microsoft.SqlServer.Smo' is a system assembly. Consider creating a user assembly to wrap desired functionality.

好了,试试“创建用户组装包装所需的功能”。

如果您的大会上标有PERMISSION_SET = SAFE你:

Msg 6522, Level 16, State 2, Line 1
A .NET Framework error occurred during execution of user-defined routine or aggregate "SmoTest":
System.Security.SecurityException: That assembly does not allow partially trusted callers.

如果您的大会上标有PERMISSION_SET = UNSAFE你:

Msg 6522, Level 16, State 2, Line 1
A .NET Framework error occurred during execution of user-defined routine or aggregate "SmoTest":
System.Exception: This functionality is disabled in the SQLCLR. It is recommended that you execute from your client application.
System.Exception:
at Microsoft.SqlServer.Management.Common.ConnectionManager..ctor()
at Microsoft.SqlServer.Management.Smo.Server..ctor()

UPDATE:

而且,我只是在2007年1月的MSDN论坛上发现了这个相关主题:

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

+1

您是否尝试反编译程序集,在VS中重新编译为一组新的程序集,然后通过SQLCLR运行该程序集?我只是觉得你走得不够远。 – siride

+0

@siride好吧,我只是尝试(一点点),并通过[ILSpy](http://ilspy.net/)获得源代码,但没有时间更新所有的命名空间引用和/或任何其他是必要的。哦,也许如果你有时间尝试? ;-) –