0

何千ものストアド プロシージャを含む SQL Server データベース (2012 年ですが、2008 年になる可能性があります) があります。

どのストアド プロシージャが特定のパラメーターを受け取っているかをプログラムで知りたいのですがcompanyid、クエリ内で実際には使用していません。

したがって、このプロジェクトの 2 つの目標は次のとおりです。

  1. パラメータを受け取らないストアド プロシージャを特定するcompanyid
  2. companyidパラメータを期待しているが、実際にはコード内で使用していないストアド プロシージャを特定します。

タスクを完了するために、TSQL を作成するか、C# でアプリを作成することを想定しています。どちらの提案も機能します。

ですから、それを達成するための最良の方法は何ですか?

前もって感謝します

================================================== ========
両方の提案に基づくと、解決策は次のとおりです。

SELECT  Specific_Name,  
        ((len(ROUTINE_DEFINITION) - len(replace(ROUTINE_DEFINITION, '@companyid', '')))/ 10) as COUNT,  
    ROUTINE_DEFINITION  
FROM    INFORMATION_SCHEMA.ROUTINES  
WHERE   ROUTINE_DEFINITION LIKE '%@companyid%'  
ORDER BY 2, 1

注: 文字列の置換を 10 で割ると、本文内のその特定の文字列のインスタンスの数が得られます。1 はパラメーターのみを意味し、2 以上は本体で使用されていることを意味します。

あなたがた両方に感謝します !!

4

2 に答える 2

1

あなたの最初の目標はこれで達成されるかもしれません

SELECT proce.name FROM sys.procedures proce 
INNER JOIN sys.procedures params ON proce .object_id=params.object_id
WHERE params.name='@companyid'

2番目の目標については、これを試すことができます

SELECT proce.name from sys.procedures proce 
INNER JOIN sys.sql_modules modules on proce.object_id=modules.object_id
WHERE definition like '%@companyid%'
于 2013-04-24T23:15:27.203 に答える
1

シンプルに聞こえるかもしれません。

ROUTINE_DEFINITIONのフィールドを見てください

select * from INFORMATION_SCHEMA.ROUTINES 

これは基本的に、sp、fn、vw の本体を提供します。

于 2013-04-24T23:48:45.223 に答える