【问题标题】:How do I deploy a managed stored procedure without using Visual Studio?如何在不使用 Visual Studio 的情况下部署托管存储过程?
【发布时间】:2010-09-12 13:31:52
【问题描述】:
我读过的所有内容都表明,在创建托管存储过程时,在 Visual Studio 中单击鼠标右键并选择部署。这很好用,但是如果我想在 Visual Studio 之外将它部署到多个不同的位置怎么办?我尝试使用在 SQL 中构建的项目的 dll 创建程序集,虽然它确实添加了程序集,但它没有从程序集中创建程序。有没有人想出如何在不使用 Visual Studio 的情况下直接在 SQL 中执行此操作?
【问题讨论】:
标签:
sql
stored-procedures
clr
【解决方案1】:
将您的程序集 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] 只是该命名空间中方法的名称。
【讨论】:
-
我发现 this 是一个有用的资源,可以从命令行完成整个事情
【解决方案2】:
要在上面@kcrumley 的回答中添加更多细节/说明:
[NAME_SPACE] 是完全限定的类型名称,而不仅仅是命名空间
- 即,如果您的类在 My.Name.Space 的命名空间中被称为 StoredProcedures,则您必须将 [My.Name.Space.StoredProcedures] 用于 [NAME_SPACE] 部分。
如果您的托管存储过程位于未定义命名空间的类中,则只需使用裸类名称(例如 [StoredProcedures])。
我还努力研究如何添加带有参数/参数的过程。因此,这里有一个示例供其他尝试这样做的人使用:
CREATE PROCEDURE [YOUR_FUNCTION]
(
@parameter1 int,
@parameter2 nvarchar
)
WITH EXECUTE AS CALLER
AS
EXTERNAL NAME [YOUR_ASSEMBLY].[StoredProcedures].[YOUR_FUNCTION]