Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak uzyskać listę wszystkich kolumn, do których odwołuje się procedura składowana?

Gdy procedura składowana jest wykonywana, jest analizowana i kompilowana do planu zapytania, jest buforowana i można uzyskać do niej dostęp za pośrednictwem sys.dm_exec_cached_plans i sys.dm_exec_query_plan w formacie XML. Plan zapytania rejestruje „listę wyników” każdej sekcji przeanalizowanego kodu. Sprawdzenie, które kolumny są używane przez procedurę składowaną, to tylko kwestia odpytywania tego kodu XML, na przykład:

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

Ostrzeżenie zależy to od tego, jak zdefiniujesz „używany”. Może się zdarzyć, że CTE w procedurze składowanej odwołuje się do 5 kolumn z tabeli, ale gdy to CTE jest używane, przekazywane są tylko trzy kolumny. Optymalizator zapytań może zignoruj ​​te dodatkowe pola i nie uwzględniaj ich w planie. Z drugiej strony optymalizator może zdecydować, że może wykonać bardziej wydajne zapytanie, dołączając dodatkowe pola do wyniku, aby umożliwić późniejsze użycie lepszego indeksu. Ten kod zwróci kolumny używane przez plan zapytania, mogą one nie być dokładnie kolumnami, które znajdują się w kodzie procedury składowanej.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Unikanie zakleszczeń SQL dzięki dostrajaniu zapytań:porady Brenta Ozara

  2. Określ ostatni dodany wiersz, gdy nie ma indeksu

  3. SQL Server SMO skarży się na brak biblioteki DLL

  4. SQL Server:ranga typu danych w operacjach arytmetycznych?

  5. Planowe utrzymanie bazy danych IS 24/7 w MS SQL Server