10

複雑なフィルタリングと操作のために、Linq ベースの CLR ストアド プロシージャに取り組んでいます。それ以外の場合は、より「従来の」ストアド プロシージャで実装すると、面倒でパフォーマンスの低い T-SQL コードが大量に必要になります。

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

何か案は?

よろしくお願いします。

4

2 に答える 2

11

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


使用している Visual Studio のバージョンはわかりませんが、Visual Studio 2010 で CLR ストアド プロシージャ プロジェクトを作成すると、プロジェクトには PreDeploymentScript.sql と PostDeploymentScript.sql の 2 つの 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の記事を参照してください。createprocedureステートメントを次のようなものに変更します。

CREATE SCHEMA foo

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

fooこれで、スキーマが所有するプロシージャを持つことができます。

于 2009-05-13T11:04:33.057 に答える