我試圖讓SQL腳本中使用的所有表的列表,使用TSQL如何從「SQL腳本」的表名在SQL Server數據庫
對於實例
SQL腳本:
SELECT t1.Name, t2.Age
FROM TableOne t1 LEFT JOIN
TableTwo t2
ON T1.Number=T2.Number
預期輸出:
TableOne
TableTwo
在此先感謝
我試圖讓SQL腳本中使用的所有表的列表,使用TSQL如何從「SQL腳本」的表名在SQL Server數據庫
對於實例
SQL腳本:
SELECT t1.Name, t2.Age
FROM TableOne t1 LEFT JOIN
TableTwo t2
ON T1.Number=T2.Number
預期輸出:
TableOne
TableTwo
在此先感謝
這只是想法而不是全面的解決方案。
您可以使用執行計劃來獲得對象名稱:
-- 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;
注意(當使用圖/表函數爲例)可能返回依賴對象。
全部,
謝謝您的建議。
不幸的是,我不能使用執行計劃,因爲這些腳本保存在表中。 另外我無法在這些腳本之上創建存儲過程,因爲我們有300多個腳本。 但是我已經開始使用下面的腳本來幫助我獲取表格了。但是我仍然在使用的場景很少(如Sub查詢)。 再次感謝
WHILE (@i<=25)
BEGIN
SELECT @SQLScript=SQLQuery
\t \t ,@TargetTableName=TargetTableName
\t \t ,@TargetDB=TargetDB
\t \t FROM #T WHERE [email protected]
SELECT @MaxLen=LEN(@SQLScript)
\t IF EXISTS (SELECT 1 FROM #T WHERE @SQLScript LIKE '%JOIN%')
\t BEGIN
\t \t SELECT @TargetTableName AS TargetTableName
\t \t \t \t ,SUBSTRING(@SQLScript,CHARINDEX('FROM',@SQLScript)+5 ,CHARINDEX(' ',SUBSTRING(@SQLScript,CHARINDEX('FROM',@SQLScript)+5,@MaxLen))) AS TableUsed
\t \t UNION
\t \t SELECT @TargetTableName AS TargetTableName
\t \t \t \t ,SUBSTRING(@SQLScript,CHARINDEX('JOIN ',@SQLScript)+5,CHARINDEX(' ',SUBSTRING(@SQLScript,CHARINDEX('JOIN ',@SQLScript)+5,@MaxLen))
\t \t)
\t \t END
\t 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
\t BEGIN
\t SELECT @TargetTableName AS TargetTableName,SUBSTRING(@SQLScript,CHARINDEX('FROM',@SQLScript)+5,@MaxLen)
\t \t --EXECUTE sp_executesql @SQLScript
\t \t
\t END
\t SET @[email protected]+1
END
把它放進一個存儲過程,然後使用'sys.dm_sql_referenced_entities'在PROC。 –
如果它只是一個查詢,您也可以使用視圖或使用'sys.sql_expression_dependencies'。 –