如何使用 SMO 在存储过程中调用 c# 函数?

时间:2021-06-04 10:59:51

标签: sql-server stored-procedures ssis c# smo

我在 C# 中设计了一个 Migrate() 方法来将一些 SQL 对象从一台服务器传输到另一台服务器,我想将它用作我的 sql 服务器中的存储过程。

如何使用 SMO 在存储过程中调用 c# 方法?还是使用c#方法作为存储过程?

由于我在脚本中使用 SMO 对象,因此无法使用它创建程序集。

我遵循了这个解决方案,但 CLR 不支持 SMO :

https://blog.sqlauthority.com/2008/10/19/sql-server-introduction-to-clr-simple-example-of-clr-stored-procedure/

另一种解决方案是将.dll创建为COM+应用程序,但不是很方便。事实上,在SQL服务器中使用OLE自动化对象并不是很稳定。

2 个答案:

答案 0 :(得分:2)

C# 和存储过程对于这里的工作来说确实是错误的工具。

虽然从技术上讲,您可以完成您想要的工作,但这些选项充满了问题。从存储过程调用 Web 服务是 well known to be problematic 并且被 SQL Server 行业的大多数领导者所反对。使用 xp_cmdshell 调用任意可执行文件会给您的环境带来不必要的安全风险。

如果不了解需要在服务器之间迁移的对象种类的所有详细信息,就很难确切知道推荐的替代方案。

PowerShell 更适合于此。您可以直接使用 SMO,而且 the open source dbatools library 中还有大量已构建的迁移相关命令。我强烈建议您看看它,而不是 C# 和存储过程方法。

根据您的要求,将您的对象放入 an SSDT project 可能非常适合您。然后,您可以使用 DAC 部署将相同的对象部署到多个服务器/数据库。

答案 1 :(得分:-1)

遗憾的是,您可以将 C# 代码直接合并到 SQL 中的唯一方法是 CLR,它允许您创建从 C# 代码编译的存储过程

幸运的是,虽然 CLR 受其支持的库/命名空间的限制,但您可以创建一个单独的 web services 项目作为解决方法,并且您的 CLR 项目可以使用这些 Web 服务,这样您就不受可以利用的库的限制。我曾经在我的 CLR 项目中使用 .NET SOAP Web 服务项目,但您可能也可以使用 RESTful 服务(例如现代 API)。


或者,您可以使用 xp_cmdshell(在存储过程中)在服务器的命令行中执行代码。然后,您就可以创建一个 C# 应用程序,将其放置在您的 SQL Server 实例可以访问的文件夹中,然后您可以通过 xp_cmdshell 执行命令来运行该应用程序。但是使用 xp_cmdshellCLR 有更多的安全风险,一般不推荐使用。

相关问题