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

T-SQLストアドプロシージャ内のパラメータ名と現在の値を動的に取得する

    プロシージャのすべてのパラメータをループして渡された現在の値を取得できるプロシージャに固執できる標準のコードを探しています-

    以下のクエリを使用して、spに渡されたすべての値を取得できます

    例:
    以下のストアドプロシージャを使用して、販売の詳細を確認できます(デモのみ)

    alter  proc dbo.getsales
    (
    @salesid int
    )
    as
    begin
    select 
    * from sales where [email protected]
    end
    

    私は自分のspを以下のように呼んでいます。

    exec  dbo.getsales 4
    

    渡された値を取得したい場合は、以下のクエリを使用できます

    select top 10* from sys.dm_exec_cached_plans cp
    cross apply
    sys.dm_exec_text_query_plan(cp.plan_handle,default,default)
    where objtype='proc'
    

    これは、コンパイル時の値として以下に示されています

    そうは言っても、考慮すべきことがたくさんあります。xmlメソッドを使用してこの値を取得できます

    2の値に対して同じストアドプロシージャを再度実行すると、どうなりますか。

    <ColumnReference Column="@salesid" ParameterCompiledValue="(4)" ParameterRuntimeValue="(2)" />
    

    ここで重要な点の1つは、ssmsから表示する実行プランを選択したときに上記の値が表示されることです。

    しかし、キャッシュの値はどうなるのでしょうか。上記のプランキャッシュクエリを使用してもう一度確認してみましょう

    <ColumnReference Column="@salesid" ParameterCompiledValue="(4)"/>
    

    コンパイルされた値とusecounts列が5-`として表示されます。これは、このプランが5回使用され、プランが最初にコンパイルされたときに渡されたパラメーターが4であることを意味します。これは、実行時の値がキャッシュに保存されないことも意味します。計画の詳細..

    したがって、要約すると、ストアドプロシージャに渡されるランタイム値を取得できます

    • 1.ステートメントのコンパイル中に渡される値(
      この情報の収集を一定期間にわたって開始し、保存されたプロシージャに対してログに記録できます。サーバーの再起動により、時間の経過とともに新しいセットを取得できると思います。パラメータ値の)
    • 2. DEVチームと連絡を取ることも良い方法です。これは、この演習が面倒な場合に、渡すことができるパラメーターの完全なリストを提供できるためです。


    1. 例外が発生したときにデータベース接続を閉じるための最適なデザインパターン

    2. JDBCorg​​.postgresql.Driverをロードしているクラスが見つかりません

    3. テーブルを動的に切り捨てることはできますか?

    4. プリペアドステートメントの内部はどのようなものですか?