我试图使用TSQL
获取SQL脚本中使用的所有表的列表例如
SQL脚本:
SELECT t1.Name, t2.Age
FROM TableOne t1 LEFT JOIN
TableTwo t2
ON T1.Number=T2.Number
预期产出:
TableOne
TableTwo
提前致谢
答案 0 :(得分:0)
这只是一个想法,而不是完全解决的问题。
您可以使用执行计划来获取对象名称:
-- in the same session
SELECT t1.Name, t2.Age
FROM TableOne t1 LEFT JOIN
TableTwo t2
ON T1.Number=T2.Number
;WITH XMLNAMESPACES('http://schemas.microsoft.com/sqlserver/2004/07/showplan'
AS ns)
,cte AS (
SELECT t.text, p.query_plan
FROM sys.dm_exec_requests AS r
CROSS APPLY sys.dm_exec_sql_text(plan_handle) t
CROSS APPLY sys.dm_exec_query_plan(plan_handle) p
WHERE r.session_id = @@SPID
), val AS (
SELECT DISTINCT s.c.value('@Schema', 'SYSNAME') AS [schema],
s.c.value('@Table', 'SYSNAME') AS [table_name]
FROM cte c
CROSS APPLY c.query_plan.nodes('//ns:Object') AS s(c)
)
SELECT *
FROM val
WHERE [schema] IS NOT NULL;
请注意,它可以返回依赖对象(例如,当使用视图/表函数时)。
答案 1 :(得分:0)
全部,
感谢您的推荐。
不幸的是我不能使用执行计划,因为这些脚本保存在表中。 此外,我无法在这些脚本之上创建存储过程,因为我们有300多个脚本。 但是我已经从下面的脚本开始,它帮助我到目前为止获得表格。但是我仍然在工作的场景很少(比如Sub查询)。 再次感谢
WHILE (@i<=25)
BEGIN
SELECT @SQLScript=SQLQuery
,@TargetTableName=TargetTableName
,@TargetDB=TargetDB
FROM #T WHERE Number=@i
SELECT @MaxLen=LEN(@SQLScript)
IF EXISTS (SELECT 1 FROM #T WHERE @SQLScript LIKE '%JOIN%')
BEGIN
SELECT @TargetTableName AS TargetTableName
,SUBSTRING(@SQLScript,CHARINDEX('FROM',@SQLScript)+5 ,CHARINDEX(' ',SUBSTRING(@SQLScript,CHARINDEX('FROM',@SQLScript)+5,@MaxLen))) AS TableUsed
UNION
SELECT @TargetTableName AS TargetTableName
,SUBSTRING(@SQLScript,CHARINDEX('JOIN ',@SQLScript)+5,CHARINDEX(' ',SUBSTRING(@SQLScript,CHARINDEX('JOIN ',@SQLScript)+5,@MaxLen))
)
END
IF EXISTS (SELECT 1 FROM #T WHERE CHARINDEX(' ',SUBSTRING(@SQLScript,CHARINDEX('FROM',@SQLScript)+5,@MaxLen))=0)-- Applies where there is SQLquery ends with single table
BEGIN
SELECT @TargetTableName AS TargetTableName,SUBSTRING(@SQLScript,CHARINDEX('FROM',@SQLScript)+5,@MaxLen)
--EXECUTE sp_executesql @SQLScript
END
SET @i=@i+1
END
&#13;