我的一位同事曾使用XML解析查詢執行計劃的聰明的想法:
執行計劃已經被保存爲XML,然後過濾網站上,以減少層級深度/號碼,其必須不大於128:
http://xmltoolbox.appspot.com/
1. Paste the XML
2. Add Column Reference as a filter
3. Format xml
4. Save it again as flatfile
過濾的XML可以讀取和在SQL處理:
DECLARE @xml xml = (
SELECT CAST(BulkColumn AS XML) FROM OPENROWSET(
BULK 'c:\temp\Herkunftsselect_filtered.xml',
SINGLE_BLOB) AS ExecPlan
);
WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS SP)
SELECT DISTINCT
'Database' = n.xml.value('./@Database','nvarchar(100)'),
'Schema' = n.xml.value('./@Schema','nvarchar(100)'),
'Tabelle' = n.xml.value('./@Table','nvarchar(100)'),
'Alias' = n.xml.value('./@Alias','nvarchar(100)'),
'Column' = n.xml.value('./@Column','nvarchar(100)')
FROM @xml.nodes('/Root/SP:ColumnReference') n(xml)
WHERE n.xml.value('./@Column','nvarchar(100)') NOT LIKE 'Expr%'
AND n.xml.value('./@Column','nvarchar(100)') NOT LIKE 'Chk%'
AND n.xml.value('./@Column','nvarchar(100)') NOT LIKE 'Bitmap%'
AND n.xml.value('./@Column','nvarchar(100)') NOT LIKE 'IsBaseRow%'
AND n.xml.value('./@Column','nvarchar(100)') NOT LIKE 'Union%'
AND n.xml.value('./@Column','nvarchar(100)') NOT LIKE 'Segment%'
ORDER BY 1,2,3,4,5
現在,唯一缺少的部分是如何完全自動化進程以遍歷腳本文件,生成執行計劃,過濾xml並運行查詢。我的同事考慮的一種方式可能是將所有腳本文件合併成一個大文件(循環遍歷文件並追加它們),以便手動過程只需要完成一次。
程序不是太糟糕,至少得到表,但列是另一回事。即使使用sys.sysdepends也只會讓你看到對象。這些對象可以是表格,但它們也可以是函數,視圖等,這些也必須進行分析。然後,當您進行臨時查詢時,幾乎不可能精確地手動解析它。 –
RedGate SQL Search具有影響分析功能,可以讓您找到存儲過程中引用列名稱的位置。不知道它會幫助你的特別查詢。 http://www.red-gate.com/products/sql-development/sql-search/ – mallan1121