質問

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つの参照を見つけました。

  1. Microsoft.sqlserver.management.smoのCLSIDおよびPROG IDは何ですか (スタックオーバーフロー上)
  2. 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()で

これを回避する方法はありません(まあ、あなたがマイクロソフトでない限り;)。

ライセンス: CC-BY-SA帰属
所属していません dba.stackexchange
scroll top