如何使用 SMO 在存储过程中调用 c# 函数?
Posted
技术标签:
【中文标题】如何使用 SMO 在存储过程中调用 c# 函数?【英文标题】:How to call c# function in stored procedure with SMO? 【发布时间】:2021-08-22 13:23:10 【问题描述】:我在 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+应用程序,但不是很方便。确实,使用OLE自动化对象在SQL server中不是很稳定。
【问题讨论】:
我不清楚 SMO 在这种情况下是否需要添加任何内容。为什么首先要使用 SMO?在 CLR 中,您可以使用SqlConnection
和 SqlCommand
直接调用 SQL。 SMO 可以完成的大多数您自己不容易复制的任务(例如生成脚本)最好留给客户端代码而不是 CLR 函数。
@JeroenMostert 我用 smo 设计了 Migrate 方法来传输一些 sql 对象。我想在我的 SQL Server 中将此方法称为 storedProcedure。
您在此处获得了 SSIS 标记,这是一个可接受的解决方案空间,还是只是急切地标记以增加覆盖范围?
【参考方案1】:
不幸的是,您可以直接将 C# 代码合并到 SQL 中的唯一方法是 CLR,这将允许您创建从 C# 代码编译的存储过程。
幸运的是,虽然 CLR 受限于它支持的库/命名空间,但您可以创建一个单独的 web services 项目作为解决方法,并且您的 CLR 项目可以使用那些 Web 服务,这样您就不会受限于可以利用的库。我曾经在我的 CLR 项目中使用 .NET SOAP Web 服务项目,但您也可以使用 RESTful 服务(例如现代 API)。
或者,您可以使用xp_cmdshell
(在存储过程中)在服务器上的命令行中执行代码。然后,您可以创建一个 C# 应用程序,将其放置在 SQL Server 实例可访问的文件夹中,然后您可以通过xp_cmdshell
执行命令来运行该应用程序。但是使用xp_cmdshell
比CLR有更多的安全风险,一般不推荐使用。
【讨论】:
【参考方案2】:C# 和存储过程确实不适合这里的工作。
虽然从技术上讲,您可以完成您想要的,但选项充满了问题。从存储过程调用 Web 服务是 well known to be problematic 并且被 SQL Server 行业的大多数领导者推荐反对。并且使用 xp_cmdshell 调用任意可执行文件会给您的环境带来不必要的安全风险。
如果不了解需要在服务器之间迁移的对象类型的所有详细信息,就很难确切知道要推荐什么替代方案。
PowerShell 更适合于此。 您可以直接使用 SMO,the open source dbatools library 中还有大量已构建的迁移相关命令。我强烈建议您看一下,而不是 C# 和存储过程方法。
根据您的要求,将您的对象放入an SSDT project 可能非常适合您。然后您可以使用 DAC 部署将相同的对象部署到多个服务器/数据库。
【讨论】:
以上是关于如何使用 SMO 在存储过程中调用 c# 函数?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 C# 中使用 SMO 使用 FILE STREAM 备份和恢复数据库
如何在 C# 中使用 SMO 列出可用的 SQL Server 实例?