Pes*_*fer 4 t-sql sql-server parsing usage-statistics
我们目前正在进行一个数据迁移项目,我们要分析数据的使用情况,也就是说我们需要弄清楚哪些表和列被使用并且需要迁移,哪些数据已经过时了。我们不仅有许多基于存储过程的 SSRS 报告,还有数百甚至数千个用于即席分析的 TSQL 脚本。手动对它们进行一一分析几乎是不可能的。
我寻找一种方法来解析这些脚本并返回脚本使用的数据。我设法在 EditPad 中编写一个宏,从脚本中提取表,但我未能对列执行相同的操作。这里的主要问题是别名、CTE,甚至是将脚本中的列名称与其他命令区分开来。
与简单的基于正则表达式的宏相比,SQL Server 必须清楚地了解脚本 -> 执行计划使用哪些列。我们有什么办法可以利用这个功能来达到我们的目的吗?或者甚至更好:是否有任何第三方工具可以满足我们的需要?到目前为止,我找不到任何东西。
非常感谢您的任何建议!
部分答案:
根据本文,可以使用 PowerShell(或编译的 .Net 语言)Microsoft.SqlServer.Management.SqlParser为 Microsoft 工具使用的 SQL 语句生成解析树。
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Management.SqlParser") | Out-Null
$ParseOptions = New-Object Microsoft.SqlServer.Management.SqlParser.Parser.ParseOptions
$ParseOptions.BatchSeparator = 'GO'
$ParseOptions.CompatibilityLevel = [Microsoft.SqlServer.Management.SqlParser.Common.DatabaseCompatibilityLevel]::Current
$ParseOptions.IsQuotedIdentifierSet = $true
$ParseOptions.TransactSqlVersion= [Microsoft.SqlServer.Management.SqlParser.Common.TransactSqlVersion]::Current
set-psdebug -strict
#$SQL=get-content $Args[0] |foreach-object{"$_`n"}
$SQL = "SELECT c.COLUMN_NAME,
c.TABLE_NAME,
t.TABLE_SCHEMA,
t.TABLE_TYPE,
t.TABLE_NAME AS t2
FROM INFORMATION_SCHEMA.TABLES AS t
JOIN INFORMATION_SCHEMA.COLUMNS AS c
ON c.TABLE_NAME = t.TABLE_NAME
AND c.TABLE_SCHEMA = t.TABLE_SCHEMA
AND c.TABLE_CATALOG = t.TABLE_CATALOG
"
$Script=[Microsoft.SqlServer.Management.SqlParser.Parser.Parser]::Parse($SQL, $ParseOptions)
$flags = [System.Reflection.BindingFlags]::Instance -bor [System.Reflection.BindingFlags]::NonPublic
$Script.GetType().GetProperty("Script", $flags).GetValue($Script).Xml
Run Code Online (Sandbox Code Playgroud)
我安装了本地版本的 SSMS 2016 和 SQL Server 2014,无需安装任何其他内容即可运行。
在解释树方面仍然有很多工作要做,但您也许可以利用它。