如何在不使用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]