Microsoft已公开scriptdomAPI以解析和生成TSQL.我是新手,还在玩它.我想知道如何从像这样的查询中获取跨数据库引用.
UPDATE t3
SET description = 'abc'
FROM database1.dbo.table1 t1
INNER JOIN database2.dbo.table2 t2
ON (t1.id = t2.t1_id)
LEFT OUTER JOIN database3.dbo.table3 t3
ON (t3.id = t2.t3_id)
INNER JOIN database2.dbo.table4 t4
ON (t4.id = t2.t4_id)
Run Code Online (Sandbox Code Playgroud)
我想要的是一个参考列表:
database1.dbo.table1.id = database2.dbo.table2.t1_id
database3.dbo.table3.id = database2.dbo.table2.t3_id
database2.dbo.table4.id = database2.dbo.table2.t4_id
Run Code Online (Sandbox Code Playgroud)
但是,对于最后一个条目database2.dbo.table4.id = database2.dbo.table2.t4_id,来自2端的两个列都来自同一个数据库database2,这不是我想要的.所以我最后要求的结果是:
database1.dbo.table1.id = database2.dbo.table2.t1_id
database3.dbo.table3.id = database2.dbo.table2.t3_id
Run Code Online (Sandbox Code Playgroud)
有可能实现scriptdom吗?
我继承了一个包含数百个存储过程的大型应用程序,其中许多使用动态 SQL。为了更好地处理我正在处理的 SQL 类型,如果我有办法解析所有这些存储过程的查询文本并提取其中包含的任何动态 SQL 的完整表达式,那将非常有用。
一个简化的表达可能是:
declare @query nvarchar(max)
set @query = 'SELECT col1,col2,col3 from ' + @DatabaseName + '.dbo.' + @TableName + ' WHERE {some criteria expression that also contains inline quotes}'
Run Code Online (Sandbox Code Playgroud)
我正在寻求上述输出(最终将在解析所有存储过程的单个查询中调用)是:
SELECT col1, col2, col3
FROM ' + @DatabaseName + '.dbo.' + @TableName + '
WHERE {some criteria expression that also contains inline quotes}
Run Code Online (Sandbox Code Playgroud)
因此,不是传入参数值之后的表达式,而是存储过程文本中的表达式文本,包括参数名称。
我对动态 SQL 参数名称为 的完全不安全的假设没有意见@query,因此在 SQL 表达式中搜索它以用作提取文本的起始位置是可以容忍的,但是因为有单引号内联,我没有简单的方法知道变量的赋值在哪里完成。
我在这个问题中包含了 [antlr] 和 [parsing] 标签,因为我觉得这超出了 T-SQL 的能力。
PS:是的,我很清楚“我不应该这样做”。
编辑
根据下面的建议,尝试了以下查询,但在这种情况下并没有真正有用:
SELECT …Run Code Online (Sandbox Code Playgroud) 我已经看过好几次了,但似乎找不到在哪里可以检索 sql 脚本中每个表引用的实际名称。NamedTableReference 是我发现的最接近的东西,但它只允许您查看表的别名,而我想要实际名称。
例子:
SELECT * FROM Table1 INNER JOIN Table2 ON Table1.ID = Table2.ID
Run Code Online (Sandbox Code Playgroud)
我想要的输出为: Table1 Table2
最后一部分不一定重要,但只是为了上下文。我正在尝试扩展开源 TSQLLint 项目的功能,这将使我能够检查我们公司中开发人员正在使用的非常活跃的表名称没有 NOLOCK 提示。