sql >> Database >  >> RDS >> Sqlserver

Hoe kan ik een lijst krijgen van alle kolommen waarnaar in een opgeslagen procedure wordt verwezen?

Wanneer een opgeslagen procedure wordt uitgevoerd, wordt deze geparseerd en gecompileerd in een queryplan, dit wordt in de cache opgeslagen en u kunt het openen via sys.dm_exec_cached_plans en sys.dm_exec_query_plan in XML-indeling. Het queryplan legt de 'outputlijst' van elke sectie van de geparseerde code vast. Om te zien welke kolommen door de opgeslagen procedure worden gebruikt, hoeft u alleen maar deze XML op te vragen, zoals dit:

--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')

Voorbehoud dit hangt af van hoe je 'gebruikt' definieert. Het kan zijn dat een CTE binnen uw opgeslagen procedure verwijst naar 5 kolommen uit een tabel, maar wanneer deze CTE wordt gebruikt, worden er slechts drie van de kolommen doorgegeven. De query-optimizer mag negeer deze extra velden en neem ze niet op in het plan. Aan de andere kant kan de optimizer besluiten dat hij een efficiëntere zoekopdracht kan maken door extra velden in een uitvoer op te nemen, zodat hij later een betere index kan gebruiken. Deze code retourneert de kolommen die worden gebruikt door het queryplan, het zijn mogelijk niet precies de kolommen die in de opgeslagen procedurecode staan.



  1. Sequelize hasMany, behoortTo, of beide?

  2. Unieke sleutel in Oracle met voorbeelden

  3. Hoe panda's-dataframe naar Oracle-database te schrijven met to_sql?

  4. databases synchroniseren Mysql SQLite