純粋なT-SQLからSMOを呼び出すことはできますか?
-
16-10-2019 - |
質問
PowerShellとSMOを使用してストアドプロシージャをスクリプト化する方法を知っています。
[System.reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo") | out-null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.ConnectionInfo") | out-null
$srv = New-Object "Microsoft.SqlServer.Management.Smo.Server"
$srv.databases['MyDatabase'].StoredProcedures['MyProc'].TextBody
しかし、クエリ内で手順テキストを使用したいので、純粋なT-SQL内で何らかの方法でSMOを呼び出すことができるかどうか疑問に思います。
開発環境でのみ実行する必要があります。
ところで:特定の名前でストアドプロシージャの定義を返す関数は、私の現在の問題を解決しますが、私の質問には答えません。
編集:
このクエリを使用するときに、特定のテーブルを参照する手順を見つけたいです。
SELECT p.name --, definition
FROM sys.sql_modules m
join sys.objects p on m.object_id = p.object_id
where p.type = 'P'
and definition like '%SearchForThis%'
これは、SMOを使用して取得したい情報とまったく同じです。
解決
あなたはを使用します SP_OA%保存Procs このため。または CLR SQL Server 2005以来。
T-SQLはデータ操作用であるため、T-SQLを介して直接実行できません。したがって、上記の2つの方法のいずれかを使用する必要があります。 XP_CMDSHELLを使用してPowerShellスクリプトを実行する場合を除きます。
これにより、T-SQLの制限が1つも表示されます。オブジェクト定義をディスクに取得する方法は?そして、あなたがこれを尋ねた理由の1つを推測します。繰り返しますが、CLRまたはSP_OA%がそれを行います。
注意すべきことの1つは、ほとんどそのことです 毎日 SMOのメソッドとプロパティは、SQLコマンドまたはクエリにマップします。したがって、T-SQLを使用して、効果的にT-SQLであるSMOを呼び出すことは循環です。
そして、使用するストアドプロシージャの定義を取得します object_definition... SMOで利用可能な他のプロパティを取得するには、Object_Propertyを使用するか、システムオブジェクトをクエリします。
他のヒント
述べられている質問に関連するように(そして、「で述べられている」という欲求ではありません」編集"):
いいえ、T-SQLからSMOを呼び出すことはできません。 OLEオートメーションストアドプロシージャ(つまり sp_OA*
)、SQLCLRを介して。
OLEオートメーション
何がわかりません olecomponent 名前はそうですが、オブジェクトを指定することでオブジェクトを作成できます clsid. 。もちろん、SMOの場合も簡単ではありませんが、Webz間で2つの参照を見つけました。
- Microsoft.sqlserver.management.smoのCLSIDおよびPROG IDは何ですか (スタックオーバーフロー上)
- simple jscriptから.netオブジェクトを作成します。 (プログラマーズタウンで)
DECLARE @ObjectToken INT, @HResult INT;
DECLARE @Source VARCHAR(500), @Description VARCHAR(500);
EXEC @HResult = sp_OACreate '{603F0A84-5631-3CA0-BCE0-C96597C2C1A0}', @ObjectToken OUT;
--EXEC @HResult = sp_OACreate '{755F7A20-E39C-31E0-8174-2E430C2C4E7A}', @ObjectToken OUT;
IF (@HResult <> 0)
BEGIN
EXEC sp_OAGetErrorInfo @ObjectToken, @Source OUT, @Description OUT;
RAISERROR('OLE Automation error. HResult: %x; @Source: %s; @Description: %s',
16, 1, @HResult, @Source, @Description);
RETURN;
END;
EXEC sp_OADestroy @ObjectToken;
両方の値が返されます:
MSG 50000、レベル16、状態1、14行目
OLEオートメーションエラー。 hResult:80040154; @Source:ODSOLE拡張手順。 @description:クラスは登録されていません
SMOはcomvisibleですが、ここで動作していないことは次の要件に関連していると思います。これはMSDNページに記載されています。 SP_OACREATE
指定されたOLEオブジェクトは有効でなければならず、 idispatch インターフェース。
SMOライブラリは、を実装していないようです IDispatch
インターフェース。
誰かがこれを機能させる方法を見つけたとしても、SQL Server 2005のリリース以来、OLEオートメーションのストアドプロシージャが非推奨されていることを考えると、まだ告知されていません。
sqlclr
SQLCLRはSMOを使用する自然な方法のように思われますが(SMOも.NETであるため)、これはSMOライブラリがSQLサーバー内で使用されているかどうかを特別に検出するため、間違いなく機能しません。メッセージ:
MSG 6522、レベル16、状態2、行1
.NETフレームワークエラーは、ユーザー定義のルーチンまたは集計「Smotest」の実行中に発生しました。
System.Exception: この機能はSQLCLRで無効になっています。クライアントアプリケーションから実行することをお勧めします。
System.Exception:
Microsoft.sqlserver.management.common.connectionmanager..ctor()で
Microsoft.sqlserver.management.smo.server..ctor()で
これを回避する方法はありません(まあ、あなたがマイクロソフトでない限り;)。