我的一位同事曾使用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