2017-07-29 71 views
1

我試圖讓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 

在此先感謝

+0

把它放進一個存儲過程,然後使用'sys.dm_sql_referenced_entities'在PROC。 –

+0

如果它只是一個查詢,您也可以使用視圖或使用'sys.sql_expression_dependencies'。 –

回答

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; 

注意(當使用圖/表函數爲例)可能返回依賴對象。

0

全部,

謝謝您的建議。

不幸的是,我不能使用執行計劃,因爲這些腳本保存在表中。 另外我無法在這些腳本之上創建存儲過程,因爲我們有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

相關問題