簡體   English   中英

如何列出 SQL 查詢中使用的所有列(包括模式和表)

[英]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_setsys.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM