何百ものストアド プロシージャがあり、その多くが動的 SQL を使用する大規模なアプリケーションを継承しました。扱っている SQL の種類をより適切に処理するには、これらすべてのストアド プロシージャのクエリ テキストを解析し、含まれている動的 SQL の完全な式を抽出する方法があれば非常に便利です。
単純化された式は次のようになります。
declare @query nvarchar(max)
set @query = 'SELECT col1,col2,col3 from ' + @DatabaseName + '.dbo.' + @TableName + ' WHERE {some criteria expression that also contains inline quotes}'
上記に対して求めている出力 (最終的には、すべてのストアド プロシージャを解析する単一のクエリで呼び出される) は次のとおりです。
SELECT col1, col2, col3
FROM ' + @DatabaseName + '.dbo.' + @TableName + '
WHERE {some criteria expression that also contains inline quotes}
したがって、パラメーター値が渡された後の式ではなく、パラメーター名を含むストアド プロシージャ テキストのような式テキストです。
動的 SQL パラメータ名が であるというまったく安全ではない仮定で問題ない@query
ので、SQL 式内でこれを検索して、テキストを抽出する開始位置として使用することは許容できますが、インラインには一重引用符があるためです。 、変数への割り当てがどこで完了したかを知る簡単な方法がありません。
この質問に [antlr] タグと [parsing] タグを含めているのは、これが T-SQL の能力を超えていると感じているからです。
PS: はい、「これを行うべきではない」ことは十分承知しています。
編集
以下の提案から、次のクエリを試しましたが、このコンテキストではあまり役に立ちませんでした:
SELECT
db_name(dbid) DB_NAME
,cacheobjtype, objtype, object_name(objectid) ObjectName
,objectid
,x.text
,usecounts
-- , x.*,z.* ,db_name(dbid)
FROM
sys.dm_exec_cached_plans z
CROSS APPLY sys.dm_exec_sql_text(plan_handle) x
WHERE
--usecounts > 1
--objType = 'Proc' and -- include if you only want to see stored procedures
db_name(dbid) not like 'ReportServer%' and db_name(dbid) <> 'msdb' and db_name(dbid) not like 'DBADB%' and db_name(dbid) <> 'master'
--ORDER BY usecounts DESC
ORDER BY objtype