sql >> データベース >  >> RDS >> Sqlserver

Receive-Jobによって返される予期しない変数タイプ

    1. Receive-Jobを呼び出したときに返される正しい/予想される変数タイプを取得する方法はありますか ?

    バックグラウンドジョブを使用しているため、タイプの忠実度が失われます :返されるオブジェクトはメソッドレスのエミュレーション 元のタイプの。

    元のタイプを手動で再作成することは、努力する価値がなく、不可能な場合もあります。ただし、おそらくエミュレーションを使用するだけで十分です。

    更新 :あなた自身の答えに従って、System.DataSetでの作業から切り替えます System.DataTableへ 結果として、サービス可能なエミュレーションが実現しました。

    詳細については、下部のセクションを参照してください。

    1. Invoke-Sqlcmdコマンドを使用して、別のADアカウントでSQLクエリを実行するためのより良い方法はありますか?

    処理中が必要です タイプの忠実度を維持するための呼び出しメソッド 、しかし、別のユーザーになりすます場合は、任意のコマンドでそれが可能だとは思いません。 。

    たとえば、Start-Jobの代わりとなるインプロセス(スレッドベース) -Start-ThreadJob --Credentialがありません パラメータ。

    したがって、最善の策は、Invoke-SqlCmdを作成することです。 の-Credential パラメータが機能するか、特定のユーザーのクレデンシャルを使用してクエリを実行する別の処理中の方法を見つけます。

    バックグラウンドジョブ/リモーティング/ミニシェルでのオブジェクトのシリアル化と逆シリアル化:

    PowerShellがプロセスの境界を越えてオブジェクトをマーシャリングするときはいつでも XMLベースのシリアル化を採用しています ソースで、逆シリアル化 目的地で CLI XMLと呼ばれる形式を使用します (共通言語インフラストラクチャXML)。

    これは、PowerShellリモーティングのコンテキストで発生します (例:Invoke-Command
    -ComputerNameを使用した呼び出し パラメータ)およびバックグラウンドジョブStart-Job )およびいわゆるミニシェル (これは、PowerShell自体の内部からスクリプトブロックを使用してPowerShellCLIを呼び出すときに暗黙的に使用されます。;例:powershell.exe { Get-Item / }

    この逆シリアル化により、タイプの忠実度が維持されます 既知のタイプの限定されたセットの場合のみ 、MS-PSRPで指定されているように、PowerShellRemotingProtocol仕様。つまり、固定されたタイプのセットのインスタンスのみが元のタイプとして逆シリアル化されます

    他のすべてのタイプのインスタンスはエミュレートされます :リストのようなタイプは[System.Collections.ArrayList]になります インスタンスでは、辞書タイプは[hasthable]になります インスタンス、およびその他のタイプは、メソッドレス(プロパティのみ)カスタムオブジェクトになります ([pscustomobject] インスタンス) 、その.pstypenames プロパティには、接頭辞Deserialized.が付いた元のタイプ名が含まれます (例:Deserialized.System.Data.DataTable )、およびタイプの baseの同じプレフィックス名 タイプ(継承階層)。

    さらに、再帰の深さ のオブジェクトグラフの場合 -[pscustomobject] インスタンスは1に制限されています レベル -これには、PowerShellカスタムクラスのインスタンスが含まれることに注意してください。 、classで作成 キーワード:つまり、入力オブジェクトのプロパティ値自体が既知の型のインスタンスではない場合(後者には、[int]などの.NETプリミティブ型を含む単一値のみの型が含まれます 、複数のプロパティで構成される型とは対照的に)、それらは.ToString()に置き換えられます。 表現(例:System.IO.DirectoryInfoと入力します .Parentがあります 別のSystem.IO.DirectoryInfoであるプロパティ インスタンス。つまり、.Parent プロパティ値は.ToString()としてシリアル化されます そのインスタンスの表現。これはフルパス文字列です)。つまり、非カスタム(スカラー)オブジェクトは、それ自体が既知の型のインスタンスではないプロパティ値が .ToString()に置き換えられるようにシリアル化されます。 表現 ;具体的な例については、この回答を参照してください。
    対照的に、明示的 Export-Clixmlを介したCLIXMLシリアル化の使用 デフォルトの深さは2 -Depthを使用してカスタム深度を指定できます 基盤となるSystem.Management.Automation.PSSerializerを使用すると、同様に深度を制御できます。 直接と入力します 。

    元のタイプによっては、 元のタイプのインスタンスを手動で再構築できる 、ただし、これは保証されていません。(.pstypenames[0] -replace '^Deserialized\.'を呼び出すと、元のタイプのフルネームを取得できます。 特定のカスタムオブジェクトで。)

    ただし、処理のニーズに応じて、エミュレーション 元のオブジェクトの数で十分な場合があります。



    1. NLSパラメータとその優先順位を設定する方法(Oracleデータベース)

    2. SQL Server(T-SQL)で英国形式で日付を表示する方法

    3. PHPを使用してMySQLに接続する方法

    4. オブジェクトタイプのネストされたテーブルを使用してOracleテーブルを作成するにはどうすればよいですか?