如何在不使用Visual Studio的情况下部署托管存储过程?
时间:2020-03-06 14:37:54 来源:igfitidea点击:
我所读的一切都说,在创建托管存储过程时,请在Visual Studio中右键单击并选择"部署"。效果很好,但是如果我想在Visual Studio之外将其部署到多个不同的位置怎么办?我尝试使用在SQL中构建的项目dll创建程序集,尽管确实添加了程序集,但并未从程序集中创建过程。有没有人想出如何不使用Visual Studio而直接在SQL中执行此操作?
解决方案
将程序集DLL文件复制到各种服务器上的本地驱动器。然后向数据库注册程序集:
create assembly [YOUR_ASSEMBLY] from '(PATH_TO_DLL)'
...然后,我们创建一个引用DLL中适当的公共方法的函数:
create proc [YOUR_FUNCTION] as external name [YOUR_ASSEMBLY].[NAME_SPACE].[YOUR_METHOD]
请务必使用[括号,尤其是在NAME_SPACE周围。命名空间中可以包含任意数量的点,但是SQL标识符不能,除非使用方括号将各部分明确分开。当我第一次使用SQL CLR时,这引起了许多麻烦。
为了清楚起见,[YOUR_ASSEMBLY]是我们在SQL中定义的名称; [NAME_SPACE]是DLL内的.NET命名空间,可以在其中找到方法; [YOUR_METHOD]只是该名称空间中方法的名称。
要在上面的@kcrumley的anwser中添加更多详细信息/说明,请执行以下操作:
[NAME_SPACE]是完全限定的类型名称,而不仅仅是名称空间
也就是说,如果类在" My.Name.Space"的命名空间中被称为" StoredProcedures",则我们必须为[NAME_SPACE]部分使用" [My.Name.Space.StoredProcedures]"。
如果托管存储过程在未定义名称空间的类中,则只需使用裸类名称(例如,StoredProcedures)。
我也为试图弄清楚如何添加带有参数/参数的过程而苦苦挣扎。因此,这是其他尝试这样做的人的示例:
CREATE PROCEDURE [YOUR_FUNCTION] ( @parameter1 int, @parameter2 nvarchar ) WITH EXECUTE AS CALLER AS EXTERNAL NAME [YOUR_ASSEMBLY].[StoredProcedures].[YOUR_FUNCTION]