gpt4 book ai didi

sql-server - 解析TSQL脚本并返回表和列的使用情况

转载 作者:行者123 更新时间:2023-12-02 17:30:38 26 4
gpt4 key购买 nike

我们目前正在进行一个数据迁移项目,我们要分析数据的使用情况,也就是说我们需要弄清楚哪些表和列被使用并且需要迁移,哪些数据已经过时了。我们不仅有许多基于存储过程的 SSRS 报告,还有数百甚至数千个用于即席分析的 TSQL 脚本。手动对它们进行一一分析几乎是不可能的。

我寻找一种方法来解析这些脚本并返回脚本使用的数据。我设法在 EditPad 中编写一个宏,从脚本中提取表,但我未能对列执行相同的操作。这里的主要问题是别名、CTE,甚至是将脚本中的列名称与其他命令区分开来。

与基于正则表达式的简单宏相比,SQL Server 必须清楚地了解脚本 -> 执行计划使用哪些列。我们有什么办法可以利用这个功能来达到我们的目的吗?或者甚至更好:是否有任何第三方工具可以满足我们的需要?到目前为止,我找不到任何东西。

非常感谢您的任何建议!

最佳答案

部分答案:

基于this article ,可以使用 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

我安装了本地版本的 SSMS 2016 和 SQL Server 2014,无需安装任何其他内容即可运行。

在解释树方面仍然有很多工作要做,但您也许可以利用它。

关于sql-server - 解析TSQL脚本并返回表和列的使用情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43142728/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com