10

我正在为一些复杂的过滤和操作开发基于 Linq 的 CLR 存储过程,否则如果在更“传统”的存储过程中实现,则需要大量混乱且性能不佳的 T-SQL 代码。

这很好用,但我找不到如何在部署阶段设置此存储过程的架构,以便更好地组织和分离模块中的数据库对象。

有任何想法吗?

提前谢谢了。

4

2 回答 2

11

更新: 在 Visual Studio 2012 中,这现在可以通过“SQL Server 数据库项目”的项目属性窗口来完成。相关属性是“项目设置”选项卡上的“默认架构”。修改此值会修改生成的部署脚本,将 Schema 名称放在 Functions、Stored Procedures 等前面... 请务必将 Schema 对象添加到具有相同名称的项目中,否则会出现构建错误。


我不知道您使用的是什么版本的 Visual Studio,但是当您在 Visual Studio 2010 中创建 CLR 存储过程项目时,该项目包含两个 SQL 脚本:PreDeploymentScript.sql 和 PostDeploymentScript.sql。

我们只是使用这些来以我们想要的方式操纵事物。

在预部署脚本中,我们有这样的内容:

-- DROP EXISTING ITEM FROM CURRENT SCHEMA
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[Utilities].[fn_Create_Md5_Hash]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION [Utilities].[fn_Create_Md5_Hash]
GO

然后,在部署后脚本中,我们有:

-- DEPLOYMENT WIZARD RECREATES ITEM IN dbo SCHEMA
-- DROP NEW ITEM FROM dbo SCHEMA
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[fn_Create_Md5_Hash]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION [dbo].[fn_Create_Md5_Hash]
GO

-- RECREATE THE ITEM BACK IN THE SCHEMA YOU WANT
CREATE FUNCTION [Utilities].[fn_Create_Md5_Hash](@source [varbinary](max))
RETURNS [varbinary](8000) WITH EXECUTE AS CALLER
AS 
EXTERNAL NAME [NameSpace].[UserDefinedFunctions].[fn_Create_Md5_Hash]
GO

希望有帮助!

于 2011-01-04T19:36:39.927 回答
3

当您创建引用程序集的过程时,您可以创建此包装器,该包装器由您想要的任何架构拥有。有关如何部署存储过程的演练,请参阅有关部署 CLR 存储过程的 MSDN 文章。通过将创建过程语句更改为以下内容:

CREATE SCHEMA foo

CREATE PROCEDURE foo.hello
AS
EXTERNAL NAME helloworld.HelloWorldProc.HelloWorld

您现在可以拥有一个由foo模式拥有的过程。

于 2009-05-13T11:04:33.057 回答