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

Caveat emptor това зависи от това как дефинирате „използван“. Възможно е CTE във вашата съхранена процедура да препраща към 5 колони от таблица, но след това, когато се използва този CTE, се предават само три от колоните. Оптимизаторът на заявки може игнорирайте тези допълнителни полета и не ги включвайте в плана. От друга страна, оптимизаторът може да реши, че може да направи по-ефективна заявка, като включи допълнителни полета в изход, за да може да използва по-добър индекс по-късно. Този код ще върне колоните, използвани от плана на заявката, те може да не са точно колоните, които са в кода на запомнената процедура.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да свържа тези двете заедно? Varchar guid и guid тип и двата първични ключа

  2. Как да вмъкна променлива в таблица с динамична заявка?

  3. Позоваване на псевдоним другаде в списъка SELECT

  4. LINQ:добавяне на клауза where само когато стойността не е нула

  5. Преобразувайте 12-часов формат в 24-часов формат в sql сървър