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

ストアド プロシージャで参照されているすべての列のリストを取得するにはどうすればよいですか?

    ストアド プロシージャが実行されると、解析されてクエリ プランにコンパイルされます。これはキャッシュされ、sys.dm_exec_cached_plans および sys.dm_exec_query_plan を介して XML 形式でアクセスできます。クエリ プランは、解析されたコードの各セクションの「出力リスト」を記録します。ストアド プロシージャで使用されている列を確認するには、次のようにこの XML をクエリするだけです。

    --Execute the stored procedure to put its query plan in the cache
    exec sys.sp_columns ''
    
    DECLARE @TargetObject nvarchar(100) = 'sys.sp_columns';
    
    WITH XMLNAMESPACES (
        'http://schemas.microsoft.com/sqlserver/2004/07/showplan' as ns1
    ), CompiledPlan AS (
        SELECT 
            (SELECT query_plan FROM sys.dm_exec_query_plan(cp.plan_handle)) qp,
            (SELECT ObjectID FROM sys.dm_exec_sql_text(cp.plan_handle)) ob
        FROM sys.dm_exec_cached_plans cp
        WHERE objtype = 'Proc'
    ), ColumnReferences AS (
        SELECT DISTINCT
            ob,
            p.query('.').value('./ns1:ColumnReference[1]/@Database', 'sysname') AS [Database],
            p.query('.').value('./ns1:ColumnReference[1]/@Schema', 'sysname') AS [Schema],
            p.query('.').value('./ns1:ColumnReference[1]/@Table', 'sysname') AS [Table],
            p.query('.').value('./ns1:ColumnReference[1]/@Column', 'sysname') AS [Column]
        FROM CompiledPlan
            CROSS APPLY qp.nodes('//ns1:ColumnReference') t(p)
    )
    
    SELECT 
        [Database], 
        [Schema], 
        [Table], 
        [Column]
    FROM ColumnReferences 
    WHERE 
        [Database] IS NOT NULL AND 
        ob = OBJECT_ID(@TargetObject, 'P')
    

    注意事項 これは、「中古」をどのように定義するかによって異なります。ストアド プロシージャ内の CTE がテーブルの 5 つの列を参照している可能性がありますが、この CTE を使用すると、3 つの列のみが渡されます。クエリ オプティマイザーはできる これらの余分なフィールドを無視し、計画に含めないでください。反対に、オプティマイザーは、出力に追加のフィールドを含めて、後でより適切なインデックスを使用できるようにすることで、より効率的なクエリを作成できると判断する場合があります。このコードは、クエリ プランで使用される列を返します。ストアド プロシージャ コードにある列と正確に一致しない場合があります。



    1. ビットフィールドのMAX演算子の代替

    2. 大文字と小文字を区別しない検索/クエリ

    3. PHPからSSLを使用してリモートMySQLサーバーに接続します

    4. loaddataコマンドを使用せずにデータベースにデータを入力する