[英]How to list all columns (including schema and table) used in a SQL query
我需要列出 SQL 查詢中使用的所有列(包括模式和表)。
我這樣做的原因是因為我需要記錄現有 Power BI 報告、存儲過程和視圖的候選清單正在使用的所有必需數據。 然后,我將進行差距分析,以查看新環境中已有哪些數據可用,並記錄需要遷移哪些數據,以便能夠重現清單中的報告、存儲過程和視圖。
輸入
SELECT FullName, EmailAddress
FROM dbo.Customers t1
LEFT JOIN dbo.Customer_EmailAddress t2 ON t1.CustomerID = t2.CustomerID
Output 應該是:
dbo.Customers.CustomerID
dbo.Customers.FirstName
dbo.Customer_EmailAddress.CustomerID
dbo.Customer_EmailAddress.EmailAddress
有誰知道這樣做的方法嗎? 我需要為大量查詢執行此操作,而我目前正在手動執行此操作,這非常耗時!
一旦你有一個查詢,你可以得到一個 XML 格式的執行計划,例如使用下面的代碼。
SET SHOWPLAN_XML ON;
GO
-- your query here
select ...
GO
SET SHOWPLAN_XML OFF;
GO
執行計划包含 ColumnReference 元素,這些元素包含您需要的數據(數據庫、模式、表和列),例如:
<ColumnReference Database="[mydb]" Schema="[sys]" Table="[sysschobjs]" Alias="[o]" Column="id">
將您得到的 XML 插入表格中,例如
create table ExecutionPlan(id int primary key,execution_plan xml)
-- cannot insert the real XML here due to SO post length limitations
insert into ExecutionPlan values (1, '<ShowPlanXML ...');
insert into ExecutionPlan values (2, '<ShowPlanXML ...');
insert into ExecutionPlan values (3, '<ShowPlanXML ...');
完成插入后,使用以下查詢提取列
with xmlnamespaces('http://schemas.microsoft.com/sqlserver/2004/07/showplan' as ns)
select distinct
ep.id
,e.val.value ('@Database' ,'sysname') as db
,e.val.value ('@Schema' ,'sysname') as scm
,e.val.value ('@Table' ,'sysname') as tab
,e.val.value ('@Column' ,'sysname') as col
from ExecutionPlan as ep
cross apply execution_plan.nodes ('//ns:ColumnReference') as e (val)
where e.val.value ('@Database' ,'sysname') is not null
order by id, db, scm, tab, col
+----+-----------------------+-------+--------------------+----------+
| id | db | scm | tab | col |
+----+-----------------------+-------+--------------------+----------+
| 1 | [mydb] | [dbo] | [mytable] | i |
| 1 | [mydb] | [dbo] | [mytable] | v |
| 2 | [mydb] | [dbo] | [mytable] | i |
| 2 | [mydb] | [dbo] | [mytable] | v |
| 3 | [mssqlsystemresource] | [sys] | [syspalnames] | class |
| 3 | [mssqlsystemresource] | [sys] | [syspalnames] | name |
| 3 | [mssqlsystemresource] | [sys] | [syspalnames] | value |
| 3 | [mssqlsystemresource] | [sys] | [syspalvalues] | class |
| 3 | [mssqlsystemresource] | [sys] | [syspalvalues] | name |
| 3 | [mssqlsystemresource] | [sys] | [syspalvalues] | value |
| 3 | [mydb] | [sys] | [sysidxstats] | id |
| 3 | [mydb] | [sys] | [sysidxstats] | indid |
| 3 | [mydb] | [sys] | [sysidxstats] | intprop |
| 3 | [mydb] | [sys] | [sysmultiobjrefs] | class |
| 3 | [mydb] | [sys] | [sysmultiobjrefs] | depid |
| 3 | [mydb] | [sys] | [sysobjvalues] | objid |
| 3 | [mydb] | [sys] | [sysobjvalues] | valclass |
| 3 | [mydb] | [sys] | [sysobjvalues] | valnum |
| 3 | [mydb] | [sys] | [sysobjvalues] | value |
| 3 | [mydb] | [sys] | [sysschobjs] | created |
| 3 | [mydb] | [sys] | [sysschobjs] | id |
| 3 | [mydb] | [sys] | [sysschobjs] | intprop |
| 3 | [mydb] | [sys] | [sysschobjs] | modified |
| 3 | [mydb] | [sys] | [sysschobjs] | name |
| 3 | [mydb] | [sys] | [sysschobjs] | nsclass |
| 3 | [mydb] | [sys] | [sysschobjs] | nsid |
| 3 | [mydb] | [sys] | [sysschobjs] | pclass |
| 3 | [mydb] | [sys] | [sysschobjs] | pid |
| 3 | [mydb] | [sys] | [sysschobjs] | status |
| 3 | [mydb] | [sys] | [sysschobjs] | status2 |
| 3 | [mydb] | [sys] | [sysschobjs] | type |
| 3 | [mydb] | [sys] | [syssingleobjrefs] | class |
| 3 | [mydb] | [sys] | [syssingleobjrefs] | depid |
| 3 | [mydb] | [sys] | [syssingleobjrefs] | depsubid |
| 3 | [mydb] | [sys] | [syssingleobjrefs] | indepid |
+----+-----------------------+-------+--------------------+----------+
聚苯乙烯
您可能希望通過編寫連接到數據庫的代碼(例如使用 Python)來自動化該過程,選擇一個查詢,獲取其執行計划並將其保存到一個表中。
您可以為此使用sp_describe_first_result_set
或sys.dm_exec_describe_first_result_set
。
例如:
create table t(id int, v varchar(30))
select
name as ActualColumnName,
concat(
QUOTENAME(s.source_database),
'.',
QUOTENAME(s.source_schema),
'.',
QUOTENAME(s.source_table),
'.')
+ QUOTENAME(s.source_column) AS SourceName
from sys.dm_exec_describe_first_result_set(N'
SELECT id, v
FROM dbo.t
', N'', 1) s;
第二個參數用於變量。 例如:
select
name as ActualColumnName,
concat(
QUOTENAME(s.source_database),
'.',
QUOTENAME(s.source_schema),
'.',
QUOTENAME(s.source_table),
'.')
+ QUOTENAME(s.source_column) AS SourceName
from sys.dm_exec_describe_first_result_set(N'
SELECT id, v, @v
FROM dbo.t
', N'@v varchar(100)', 1) s
對於查詢中使用的每個引用的列表,您可以使用sys.dm_sql_referenced_entities
。 它只適用於存儲過程。
試試下面的代碼:
select sc.TABLE_SCHEMA + N'.' + o.name + N'.' + c.name from sys.all_objects o
inner join sys.all_columns c on o.object_id = c.object_id
inner join INFORMATION_SCHEMA.TABLES sc on o.name = sc.TABLE_NAME
where type = N'U'
通過以上 SQL 服務器查詢,您可以根據需要獲取列列表:
dbo.Customers.CustomerID
然后你可以過濾你的表和列來達到你需要的列。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.