我正在研究基于Linq的CLR存储过程,用于一些复杂的过滤和操作,如果在更“传统的”存储过程中实现,则需要大量凌乱且性能不佳的T-SQL代码。
这很有用,但我找不到如何在部署阶段设置此存储过程的模式,以便更好地组织和分离模块中的数据库对象。
有什么想法吗?
非常感谢提前。
答案 0 :(得分:11)
更新:在Visual Studio 2012中,现在可以通过“SQL Server数据库项目”的项目属性窗口完成此操作。相关属性是“项目设置”选项卡上的“默认架构”。修改此值会修改生成的部署脚本,以将Schema名称放在函数,存储过程等之前...确保使用相同的名称将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
希望有所帮助!
答案 1 :(得分:2)
当您创建引用程序集的过程时,您可以创建此包装器,由所需的任何架构拥有。有关如何部署存储过程的演练,请参阅This MSDN article on deploying CLR stored procedures。通过将create procedure语句更改为:
CREATE SCHEMA foo
CREATE PROCEDURE foo.hello
AS
EXTERNAL NAME helloworld.HelloWorldProc.HelloWorld
您现在可以拥有foo
架构所拥有的程序。