質問

私は、複雑なフィルタリングと操作のために Linq ベースの CLR ストアド プロシージャに取り組んでいます。これをより「従来の」ストアド プロシージャで実装すると、多くの乱雑でパフォーマンスの悪い T-SQL コードが必要になります。

これはうまく機能していますが、モジュール内のデータベース オブジェクトをより適切に構成して分離するために、展開段階でこのストアド プロシージャのスキーマを設定する方法が見つかりません。

何か案は?

よろしくお願いします。

役に立ちましたか?

解決

あなたがアセンブリを参照するプロシージャを作成するとき、あなたが望む任意のスキーマによって所有され、このラッパーを作成することができます。 CLRストアドプロシージャを展開上のこのMSDNの記事noreferrer">

他のヒント

アップデート: Visual Studio 2012では、「SQL Server Database Project」のプロジェクトプロパティウィンドウを介して実現できるようになりました。関連するプロパティは、[プロジェクト設定]タブの「デフォルトスキーマ」です。この値を変更すると、生成された展開スクリプトが変更され、関数、ストアド プロシージャなどの前にスキーマ名が追加されます。必ず同じ名前のスキーマ オブジェクトをプロジェクトに追加してください。追加しないと、ビルド エラーが発生します。


使用している Visual Studio のバージョンはわかりませんが、Visual Studio 2010 で CLR ストアド プロシージャ プロジェクトを作成すると、プロジェクトには 2 つの 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

お役に立てば幸いです!

scroll top