2017-09-15 12 views
1

Microsoft SQL Serverデータベースを同じ構造で同期するアプリケーションを作成しました。私が解決しなければならないタスクの1つは、ソースデータベースからターゲットデータベースに任意のデータベースルーチン(プロシージャ、ファンクション、トリガなど)を転送することです。ルーチン転送のために私は、クエリMicrosoft SQL ServerでCLR関数のテキストはどこにありますか?

SELECT [definition] FROM sys.sql_modules WITH (NOLOCK) WHERE object_id = OBJECT_ID('SOME_OBJECT_ID') 

または

SELECT * FROM INFORMATION_SCHEMA.ROUTINES where routine_name like '%SOME_ROUTINE_NAME%' 

を使用して、それはCLR機能([type_desc] = CLR_TABLE_VALUED_FUNCTIONまたは[type_desc] = CLR_SCALAR_FUNCTIONと機能)を除き、すべてのルーチンのために完璧に動作します。

テキストはsys.sql_modulesデータテーブルに格納されず、システムビューINFORMATION_SCHEMA.ROUTINESには値[ROUTINE_BODY] = EXTERNAL[ROUTINE_DEFINITION] = NULLが含まれています。

しかし、CLR関数のテキストは、変更するとユーザーの変更によって保存できるため、開くたびに再作成されません。

だから、私はCLR関数のテキストの場所についてのヒントについて非常に感謝しています。

更新:.NETライブラリ関数自体を転送する必要はありません。プログラマビリティ>関数>テーブル値関数で手動で作成したラッパー関数を転送したいだけです。

+0

CLR関数は、.NETで作成され、SQLサーバーに登録されたアセンブリ(dll)です。アセンブリsys.assembliesからリストを取得できます。 SQL Server内のCLR関数のテキスト定義は取得できません。 –

+0

@RahulRichhariya、CLR関数(= .NETライブラリ関数)を転送したくないので、CLR_TABLE_VALUED_FUNCTIONまたはCLR_SCALAR_FUNCTION - Programmability> Functions> Table-valued関数リストにあるオブジェクトについて質問しました。また、標準機能(SQL_SCALAR_FUNCTION)のようにこのオブジェクトを編集して保存することができます。 – Dmitry

+0

したがって、たとえばCREATE FUNCTION [dbo]。[len_s](@str nvarchar(4000))の同等のものを生成しようとしています。 RETURNS bigint EXTERNAL NAME [SurrogateStringFunction]。[Microsoft.Samples.SqlServer .SurrogateStringFunction]。[LenS]; '? –

答えて

0

Server Profilerは、Management StudioがCLRラッパー機能を構築するために使用する35種類の動的クエリを示しています。したがって、関数のテキストは残念ながらオンザフライで構築され、システムデータベースの深みには何も格納されません。

0

CLR関数またはプロシージャを調べるには、CLR関数としていくつかの手順を実行する必要があります。プロシージャはアセンブリから作成されます。

ステップ-1: - PowerShellを使用して

ステップ-2: - 使用.NETアセンブリの逆コンパイラhttp://ilspy.net/またはredgateリフレクタ

このメソッドは、アセンブリ作成者が実行していない場合に機能しますデコンパイルを防止する追加ステップ。

+0

データベース間で.NETライブラリを転送する必要はありません。プログラマビリティ>関数>テーブル値関数で作成されたCLRラッパー関数を転送します。@ Damien_The_Unbelieverのコメントを見てください、彼はポイントを持っています。 – Dmitry

+0

お元気です。 PowerShellを使用しても問題ないですか、SQLクエリのみを使用したいですか? –

+0

私はSQLクエリを使用する方が好きですが、あなたが提供できるソリューションには非常に感謝しています。しかし、すべてのクエリが 'sys.sql_modules'データテーブルにあり、簡単に選択することができ、(同じように見え、同じ方法で変更できる)CLRラッピングクエリをPowerShellを使用して抽出する必要があることは私にとって非常に奇妙です。 – Dmitry

関連する問題