問題タブ [clrstoredprocedure]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
sql-server-2008 - CLR ストアド プロシージャで外部プロセスを呼び出す
これが簡単なことではないことも、非常に人気があるべきではないこともわかっています。しかし、トリガーまたはストアド プロシージャのパラメーターを使用して外部アセンブリを呼び出す最良の方法を知っている人はいますか? CLR ストアド プロシージャを試しましたが、DB2 データベースを更新するために必要な参照を追加できません。したがって、それを実行できる外部アセンブリを呼び出したいと思います。次に、更新トリガーでこのアセンブリを呼び出します。
SQL Server 2008 R2 では、sys.xp_cmdshell プロシージャは既定でブロックされます。したがって、ここのセキュリティ担当者はそれをオンにしたくないでしょう。
ありがとう !
log4net - Log4Net を使用して CLR ストアド プロシージャ内のログ ファイルに書き込むことは可能ですか?
問題: CLR ストアド プロシージャ内で Log4net を使用してログ ファイルをデバッグ (書き込み) できません。CLR プロジェクトをビルドする方法に問題がある可能性がありますか? DLLをSQLサーバーにインポートするだけです(アセンブリの作成....)。App.Config もインポートする必要がありますか?
DLL 名: CLRTest.dll
ソースコード:
Log4Net XML 構成 (App.Config):
SQL Server に対する権限:
C:\log\ -- NETWORK SERVICE と MyDomain\sqlserveraccount には、「ログ」フォルダーに対するフル コントロールがあります。
SQL スクリプト:
SQL 出力:
(列名なし)
1
sql - Sql Service Broker、CLR 統合、トリガー バック エンドの問題
データを保存/処理するためのバックエンドを構築する最も効率的な方法を探しています。基本的に、データはサーバーに送信され、解析されてからデータベースに保存されます。次に、データベース内の他のデータに基づいて何らかの処理が行われ、電子メールまたは SMS を介してアラートが発生します。
プラットフォームは .NET で、DB は SQL Server 2005 または 2008 です。
いえ
- 温度センサーは、4 バイトのデータをサーバーに送信します。
- サーバーはデータを実際の値、たとえば 20 に変換します。
- その後、値は SQL サーバー db に保存されます。
- 次に、値は、そのセンサーに設定された境界 (0 ~ 50) を持つテーブル内の行に対してチェックされます。
- 範囲外の場合、アラートが発生します。(SMSまたはメールで送信されます。)
これはすべて非常に簡単に思えますが、理想的なシナリオはすべてが「リアルタイム」で発生し、1秒あたり数百または数千のリクエストになる可能性があることを考えると、それを行うための最良の方法を探しています. 私は、SQL 2005/08 の「新しい」機能のいくつか (Service Broker、CLR 統合、トリガーなど、経験がほとんどない) を活用したいと考えていました。
ステップ 1 と 2 はすでに完了しています。
キューイングするトランザクションの数を考慮して、サービス ブローカーまたは MSMQ を使用するのが賢明でしょうか? 境界データを調べる必要がある場合、どの時点でアラート データを処理すればよいですか? データをどのように処理したいかについていくつかのアイデアがありますが、使用するのに最適なテクノロジー/方法論がわかりません。
私の考えは (ステップ 3 から)、データをサービス ブローカーに送信し、サービス ブローカーが CLR プロシージャを呼び出して、データの「ビジネス ロジック」を処理することです。または、トリガーを使用してデータを Service Broker に追加し、データを処理しますか? Service Broker は CLR プロシージャを直接呼び出すことができますか? ポーリングではなくイベント駆動型のデータを処理したい場合、Service Broker を使用することは正しい考えでしょうか?
Service Broker で見た例から、データを受信するにはコードが必要であるように見えますが、実際にやりたいことは、データをキューに追加し、キューを自動的に空にすることです (アラート データを次のように処理します)。そうします)。
標準のストアド プロシージャを使用してこれらすべてを行うこともできますが、ビジネス ロジックが例よりもはるかに複雑になるため、ストアド プロシージャの使用は最小限に抑え、代わりに CLR 統合を使用したいと考えています。
サービス ブローカーがキューイングとスレッド化を処理することを考えると、CLR プロシージャを呼び出してアラート データを処理し、SMS や電子メールを送信するのに適していると思いました。
光を見せてください!ありがとう!
tsql - TSQLCLRプロシージャの並列化
手続き型コードを並列化してテーブルにレコードを作成する方法を理解しようとしています。
これが状況です(申し訳ありませんが、実際のコードの方法で多くを提供することはできません):
以前のサービス日、現在のマイレージ、計画された1日のマイレージ、および各サービス間のマイレージの差に基づいて、車両サービスがいつ必要になるかを予測する必要があります。
全体として、これは非常に手続き的なものであり、車両ごとに、その履歴、現在の整備状態、毎日の走行距離(走行距離計画で定義された範囲に基づいて変更される可能性があります)、および整備の順序を考慮する必要があります。
現在、これらすべてをPHPで計算しており、100台の車両で約20秒かかります。これは将来数千に拡張される可能性があるため、20秒は長すぎます。
そこで、CLRストアドプロシージャで試してみることにしました。最初はマルチスレッド化を試してみようと思っていましたが、TSQLホストで実行するのは簡単ではないことがすぐにわかりました。TSQLが並列化自体を実行できるようにすることをお勧めしました。しかし、私にはその方法がわかりません。コードがレコードを作成する必要があるという事実がなければ、関数として定義して次のようにすることができます。
そして、TSQLはそれを並列化できることを理解する必要がありますが、プロシージャの代替手段はありません。
これを並列化するために私にできることはありますか?
.net - CLR ストアド プロシージャを実行して Cognos レポートを実行すると、System.IO.FileNotFoundException が発生する
おはよう。現在、Visual Basic (VS 2008) で作成されたアセンブリを呼び出す CLR ストアド プロシージャで問題が発生しています。最上位レベルでは、アセンブリは Cognos8 に含まれるレポートを実行し、出力をネットワーク上の特定のディレクトリに移動します。単純なテスト EXE からメソッドを呼び出すときは問題ありませんが、CLR ストアド プロシージャを介して実行しようとすると、次のようになります。
メッセージ 6522、レベル 16、状態 1、プロシージャ ReportRunner、行 0
ユーザー定義ルーチンまたは集約 "ReportRunner" の実行中に .NET Framework エラーが発生しました:
System.IO.FileNotFoundException: ファイルまたはアセンブリ 'cognosdotnetassembly_2_0, Version=10.1.4707.501, Culture=neutral, PublicKeyToken=d6e6d7d808b7e5b7' またはその依存関係の 1 つを読み込めませんでした。システムは、指定されたファイルを見つけることができません。System.IO.FileNotFoundException:
System.Reflection.Assembly._nLoad (AssemblyName fileName、文字列 codeBase、証拠 assemblySecurity、Assembly locationHint、StackCrawlMark& stackMark、ブール型 throwOnFileNotFound、Boolean forIntrospection) で
System.Reflection.Assembly.nLoad (AssemblyName fileName、文字列 codeBase、証拠 assemblySecurity、Assembly locationHint、StackCrawlMark& stackMark、ブール型 throwOnFileNotFound、Boolean forIntrospection) で
System.Reflection.Assembly.InternalLoad (AssemblyName assemblyRef、証拠 assemblySecurity、StackCrawlMark & stackMark、Boolean forIntrospection) で
System.Reflection.Assembly.LoadWithPartialNameInternal (文字列の partialName、証拠 securityEvidence、StackCrawlMark & stackMark) で
System.Reflection.Assembly.LoadWithPartialName (文字列の partialName、証拠 securityEvidence) で
System.Xml.Serialization.TempAssembly.LoadGeneratedAssembly (型の型、文字列の defaultNamespace、XmlSerializerImplementation & 契約) で
System.Xml.Serialization.XmlSerializer.FromMappings (XmlMapping[] マッピング、型の種類) で System.Web.Services.Protocols.SoapClientType..ctor (型の種類) で
System.Web.Services.Protocols.SoapHttpClientProtocol..ctor() で cognosdotnet_2_0.reportService1..ctor() で
ReportRunnerv3.ReportRunner.ExecuteReport (Int32 inPLAN_ID、Int32 inContract_Sfx、文字列 inRptDate_DT、文字列 inPlanType、文字列 inInvstmentOnlyInd、文字列 inMOMInd、文字列 inGPSIInd、文字列 inPBTInd、文字列 inPICAInd、文字列 inClientAccomInd、文字列 inInstSelectInd、文字列 inRptType、Int32& outRC) で
注 •cognosdotnetassembly_2_0 は、"ReportRunner" アセンブリと同じディレクトリにあります。
以下は、fuslogvw.exe によって提供されるメッセージです。
* アセンブリ バインダー ログ エントリ (2011 年 8 月 11 日 @ 5:57:39 AM) *
操作に失敗しました。
バインド結果: hr = 0x80070002。システムは、指定されたファイルを見つけることができません。
アセンブリ マネージャーの読み込み元: c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll
実行可能ファイルの下で実行 c:\Program Files\Microsoft SQL Server\MSSQL10_50.SQLEXPRESS\MSSQL\Binn\sqlservr.exe
--- 詳細なエラー ログが続きます。
=== プレバインド状態情報 ===
ログ: ユーザー = NT AUTHORITY\NETWORK SERVICE
ログ: DisplayName = cognosdotnetassembly_2_0、バージョン = 10.1.4707.501、カルチャ = ニュートラル、PublicKeyToken = d6e6d7d808b7e5b7 (完全指定)
ログ: Appbase = file:///c:/Program Files/Microsoft SQL Server/MSSQL10_50.SQLEXPRESS/MSSQL/Binn/
ログ: 初期 PrivatePath = NULL
ログ: 動的ベース = NULL
ログ: キャッシュ ベース = NULL
ログ: AppName = NULL
アセンブリの呼び出し: System.Xml、Version=2.0.0.0、Culture=neutral、PublicKeyToken=b77a5c561934e089。
===
ログ: このバインドはデフォルトのロード コンテキストで開始されます。ログ: アプリケーション構成ファイルが見つかりません。
ログ: c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\config\machine.config のマシン構成ファイルを使用しています。
ログ: ポリシー後の参照: cognosdotnetassembly_2_0、バージョン = 10.1.4707.501、カルチャ = ニュートラル、PublicKeyToken = d6e6d7d808b7e5b7
LOG: Fusion がホストされています。このアセンブリについてホストを確認してください。
ログ: アセンブリが CLR ロード リストにありません。ホスト組立店に聞く。
ログ: アセンブリ cognosdotnetassembly_2_0、version=10.1.4707.501、culture=neutral、publickeytoken=d6e6d7d808b7e5b7、processorarchitecture=x86 でホスト アセンブリ ストアを試してください。
ログ: アセンブリ cognosdotnetassembly_2_0、version=10.1.4707.501、culture=neutral、publickeytoken=d6e6d7d808b7e5b7、processorarchitecture=msil でホスト アセンブリ ストアを試してください。
ログ: アセンブリ cognosdotnetassembly_2_0、バージョン = 10.1.4707.501、カルチャ = ニュートラル、publickeytoken = d6e6d7d808b7e5b7 でホスト アセンブリ ストアを試してください。
WRN: ホスト アセンブリ ストアにこのアセンブリが含まれていません。
ERR: 事前ダウンロードチェック中に回復不可能なエラーが発生しました (hr = 0x80070002)。
SQL Server が cognosdotnetassembly_2_0 を見つけられない理由について誰か洞察を提供できますか?
さらに詳しい情報が必要な場合は、お知らせください。
ご協力ありがとうございます。
――クリス
sql - 2000 万件以上のレコードに対する効率的な SQL Geography ワイルドカード名検索
2,000 万以上の geoWe ロケーション (および増加中) を含む SQL 2008 データベースがあり、各ロケーションには標準の名前/住所/地理/ID/その他の列が含まれています。
距離に基づいてレコードを効率的に検索する方法だけでなく、全文索引を介した「含む」キーワードも必要です。基本的な考え方は、最大距離に基づいて近くの場所を検索することです。
現在、1 マイル以内にあるスターバックスなどの完全な文字列を検索すると、検索は数秒で返されます。ただし、1 マイル以内で「星」を検索すると、検索に数分かかる場合があります。
次のようなロジックをいじっています。
ただし、これにより、検索で重複やその他の問題が発生します。また、オンラインで見つけた POWER フォーラムも使用しようとしています。
距離または特定のカテゴリ ID のみに基づいており、1 秒未満で返される他のクエリがうまく機能しています。大きな問題は、ワイルドカード文字列の一致です。
2000 万以上のレコードを処理するときに名前 (ワイルドカードのサポート) と距離を受け入れる素晴らしい SQL または CLR proc を持っている人はいますか?
今、私たちは非常に立ち往生しています:(
前もって感謝します、ジェフ
clr - SqlContext.Pipe.Send を使用した clr ストアド プロシージャは、10 進数を返す必要があり、int を返します
10 進数値を返さなければならない clr ストアド プロシージャがあります。現時点では出力パラメータを使用できません。出力パラメータを処理しない既存のライブラリを再利用する必要があります。ストアド プロシージャは値を返しますが、10 進数が失われます。
理由はありますか?ありがとう、ジェニー
編集: SqlContext.Pipe.Send(string.Format("decValue = {0}", decValue)); を追加するのを忘れていました 小数点以下は表示されますが、SqlContext.Pipe.Send(record); 小数点以下の桁数を返しません。
sql-server - .NET Framework の実行が中止されました。別のクエリにより、AppDomain db.dbo[runtime].4 がアンロードされました
デバッグしようとしている SQL CLR 関数 (c#.net で記述) があります。Visual Studio を sqlserver プロセスにアタッチしてステップ スルーを開始しましたが、クラッシュし続け、次のエラー メッセージが表示されて終了します。
.NET Framework の実行が中止されました。別のクエリにより、AppDomain DatabaseName.dbo[runtime].4 がアンロードされました。
(DatabaseName.dbo[runtime] 変更後の番号 - クラッシュごとに増分)
場合によっては、SQL サーバー プロセスがクラッシュし、サービスが停止することもあります。
私がデバッグしていないとき、関数はエラーなしで完全に正常に動作します。これは、デバッグ中にのみ発生します。
誰がこれを引き起こしているのか考えていますか?
ありがとう
msbuild - MsBuild コマンド ラインを使用して CLR ストアド プロシージャを展開するにはどうすればよいですか?
ソリューション エクスプローラーから SqlClr プロジェクト プロジェクトを展開するには、それを右クリックして [展開] を選択します。ただし、カスタム ConnectionString も指定できるコマンド ライン バージョンが必要です。
sql-server-2008 - SQL Server 2008 からのアンマネージ C/C++ DLL 関数の呼び出し
SQL Server 2008 から呼び出す必要がある C/C++ 関数の膨大なライブラリがあります。これらの関数を Win32 DLL からロードDllImport
して .Net コードに公開する C# アダプター クラスを作成しました。これは、ほとんどの .Net アプリケーションで問題なく機能します。
今、私は SQL Server CLR で同じ手法を使用しようとしていました。アダプター クラスを呼び出す一連の CLR 関数とストアド プロシージャを作成します。これは、管理されていない DLL を読み込もうとすると が発生するため、機能しませんSystem.BadImageFormatException
。
拡張ストアド プロシージャを使用してこれを行うことができますが、その方法は推奨されておらず、SQL Server の新しいリリースでは廃止される可能性があります。
CLR ストアド プロシージャからアンマネージ関数を呼び出す適切な方法は何でしょうか? これはアウトプロセスで行うべきだと思います。
これらの関数を公開する Web サービスをストアド プロシージャで呼び出そうとしています。これは良いアイデアのように思えますが、これまでのところ、Web サービス呼び出しを行う SQLCLR アセンブリの展開に問題があります。アセンブリのバージョンに依存するアセンブリをSystem.ServiceModel.dll
読み込めません。version=3.0.0.0
System.Web.dll
2.0.0.0
アセンブリをロードSystem.Web
すると、次のエラーが表示されます。
アセンブリ 'System.Web' は、現在のデータベースに存在しないアセンブリ 'system.web, version=2.0.0.0, culture=neutral, publickeytoken=b03f5f7f11d50a3a.' を参照しています。SQL Server は、アセンブリの参照元と同じ場所から参照アセンブリを見つけて自動的に読み込もうとしましたが、その操作は失敗しました (理由: バージョン、カルチャ、または公開キーの不一致)。参照されているアセンブリを現在のデータベースに読み込み、要求を再試行してください。
System.Web
アセンブリの展開に関する問題の解決策を見つけました。から展開するのではなく、 から展開するC:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Web.dll
必要がありますC:\Windows\Microsoft.NET\Framework64\v2.0.50727\System.Web.dll
。次に、他のすべての必要なアセンブリもデプロイされます。
デプロイ順のアセンブリのリスト:
- C:\Windows\Microsoft.NET\Framework\v3.0\Windows Communication Foundation\SMdiagnostics.dll
- C:\Windows\Microsoft.NET\Framework64\v2.0.50727\System.Web.dll
- C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Messaging.dll
- C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\System.IdentityModel.dll
- C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\System.IdentityModel.Selectors.dll
- C:\Windows\Microsoft.NET\Framework\v3.0\Windows Communication Foundation\Microsoft.Transactions.Bridge.dll