我的工作基于LINQ的CLR存储过程对于一些复杂的过滤和操作,否则将需要大量的混乱和高性能差T-SQL代码,如果在一个更“传统”的存储过程实现的。

这是伟大的工作,但我无法找到如何设置这个存储过程的架构中部署的阶段,对数据库对象的模块一个更好的组织和分离。

任何想法?

预先非常感谢。

有帮助吗?

解决方案

在创建过程引用组件,您可以创建此包装用任何你想要的架构所拥有。请参见这MSDN文章上部署CLR存储过程对于如何做一个演练部署一个存储过程。通过改变CREATE PROCEDURE语句是这样的:

CREATE SCHEMA foo

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

您现在可以通过foo架构所拥有的过程。

其他提示

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


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

我们只是用它们来maniuplate东西,我们所希望的方式。

在部署前的脚本,我们有这样的事情:

-- 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

希望帮助!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top