如何从SQL Server数据库中的“SQL脚本”获取表名

时间:2017-07-29 18:23:05

标签: sql sql-server tsql

我试图使用TSQL

获取SQL脚本中使用的所有表的列表

例如

SQL脚本:

SELECT t1.Name, t2.Age
FROM TableOne t1 LEFT JOIN
     TableTwo t2
     ON T1.Number=T2.Number

预期产出:

TableOne
TableTwo

提前致谢

2 个答案:

答案 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;
&#13;
&#13;