質問
過去に、SQLCLR内にスリッピング言語(JScriptなど)を埋め込むことができたため、特定の計算を実行するためにスクリプトを関数のパラメーターとして渡すことができます。簡単な例を次に示します(関数ssScriptExecuteは、スクリプト内のすべての印刷物の連結を返します):
select dbo.ssScriptExecute( 'print("Calculation: "+(1+2/3) );' )
-- Calculation: 1.6666666666666665
Powershellランタイムを同じ方法で埋め込むことができるようになりたいです。しかし、ランタイムはパスでアセンブリを見つけようとし、SQlCLR内にパスがないため、あらゆる種類の問題が発生しました。発生したエラーに関する詳細情報を提供できることを嬉しく思いますが、誰かがこれを試したかどうか疑問に思っていました!
ありがとう!
解決
変更されたSystem.Automation.Managementにilコードインジェクションを使用します。 GetPSVersionTable()の変数バージョンを" 2.0"にする その後、SQL ServerでPowershellコードを実行できます。
Visual Studioプロジェクトでこの変更されたdllを必ず参照してください。
http://www.box.net/shared/57122v6erv9ss3aopq7p
btw、powershellをSQLで実行して必要なすべてのdllを自動登録する
このps1コードを使用できます
他のヒント
これを行う唯一の方法は、PowershellをホストするWCFサービスを作成し、SQLCLRが要求dbo.ssScriptExecute(...)をそのサービスに送信して実行することだと思います。 それに加えて、SQLCLR(DLR言語のメモリリーク問題のないインタープリター)にpaxScript.netを正常に埋め込みました。
SQLCLRは特定のアセンブリセットのみに制限され、PS Automationはそれらの1つではないと考えました。