Vit*_*tta 9 sql-server stored-procedures sql-server-2005 sqlclr sql-server-data-tools
我正在研究一个基于Linq的CLR存储过程,用于一些复杂的过滤和操作,否则如果在更"传统"的存储过程中实现,则需要大量凌乱且性能不佳的T-SQL代码.
这工作得很好,但我找不到如何在部署阶段设置此存储过程的模式,以便更好地组织和分离模块中的数据库对象.
有任何想法吗?
提前谢谢了.
Eri*_*ham 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
希望有所帮助!
当您创建引用程序集的过程时,您可以创建由您想要的任何架构拥有的此包装器。请参阅这篇有关部署 CLR 存储过程的 MSDN 文章,了解如何部署存储过程的演练。通过将创建过程语句更改为:
CREATE SCHEMA foo
CREATE PROCEDURE foo.hello
AS
EXTERNAL NAME helloworld.HelloWorldProc.HelloWorld
您现在可以拥有该模式拥有的过程foo。