2012-11-06 68 views
1

我有一個返回30列的視圖。該視圖由三個表的內部連接創建。我想查詢哪個列是從哪個表中使用查詢而不是逐行瀏覽視圖。 有沒有辦法在SQL Server 2008中做到這一點? 由於事先查看列的表名

回答

2

我想找出柱從該表中獲得使用查詢,而不是通過線通過視圖行會

沒有,沒有。

如果數據來自的表很重要,那麼您可以在視圖中使用列的別名來標識它們來自哪些表。

然而,這將會否定首先觀看的理由。

0

您可以查詢列名和表名的執行計劃XML。

在此設置:

create table Table1 
(
    Table1ID int identity primary key, 
    Name varchar(10) 
) 

create table Table2 
(
    Table2ID int identity primary key, 
    Table1ID int not null references Table1(Table1ID), 
    Name varchar(10) 
) 

go 

create view Table_1_2 as 
select T1.Table1ID, 
     T1.Name as Table1Name, 
     T2.Name as Table2Name 
from Table1 as T1 
    inner join Table2 as T2 
    on T1.Table1ID = T2.Table1ID 

執行對從SQL Server Management Studio中的視圖與查詢 「包括實際的執行計劃」 啓用。

select * 
from Table_1_2 
where 0 = 1 

選擇執行計劃選項卡,右鍵單擊並選擇顯示執行計劃XML。 將XML複製到新的查詢窗口中,將其分配給XML變量並查詢XML以獲取所需的信息。

declare @XML xml = N'<?xml version="1.0" encoding="utf-16"?> 
<ShowPlanXML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Version="1.2" Build="11.0.2100.60" xmlns="http://schemas.microsoft.com/sqlserver/2004/07/showplan"> 
    <BatchSequence> 
    <Batch> 
     <Statements> 
     <StmtSimple StatementCompId="1" StatementEstRows="0" StatementId="1" StatementOptmLevel="TRIVIAL" StatementSubTreeCost="1.57E-07" StatementText="select *&#xD;&#xA;from Table_1_2&#xD;&#xA;where 0 = 1" StatementType="SELECT" QueryHash="0xEBAD405D39FDCB6A" QueryPlanHash="0xAE962A4D575B83FE" RetrievedFromCache="true"> 
      <StatementSetOptions ANSI_NULLS="true" ANSI_PADDING="true" ANSI_WARNINGS="true" ARITHABORT="true" CONCAT_NULL_YIELDS_NULL="true" NUMERIC_ROUNDABORT="false" QUOTED_IDENTIFIER="true" /> 
      <QueryPlan DegreeOfParallelism="1" CachedPlanSize="16" CompileTime="0" CompileCPU="0" CompileMemory="112"> 
      <MemoryGrantInfo SerialRequiredMemory="0" SerialDesiredMemory="0" /> 
      <OptimizerHardwareDependentProperties EstimatedAvailableMemoryGrant="25600" EstimatedPagesCached="25600" EstimatedAvailableDegreeOfParallelism="8" /> 
      <RelOp AvgRowSize="27" EstimateCPU="1.57E-07" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="0" LogicalOp="Constant Scan" NodeId="0" Parallel="false" PhysicalOp="Constant Scan" EstimatedTotalSubtreeCost="1.57E-07"> 
       <OutputList> 
       <ColumnReference Database="[xx]" Schema="[dbo]" Table="[Table1]" Alias="[T1]" Column="Table1ID" /> 
       <ColumnReference Database="[xx]" Schema="[dbo]" Table="[Table1]" Alias="[T1]" Column="Name" /> 
       <ColumnReference Database="[xx]" Schema="[dbo]" Table="[Table2]" Alias="[T2]" Column="Name" /> 
       </OutputList> 
       <RunTimeInformation> 
       <RunTimeCountersPerThread Thread="0" ActualRows="0" ActualEndOfScans="1" ActualExecutions="1" /> 
       </RunTimeInformation> 
       <ConstantScan /> 
      </RelOp> 
      </QueryPlan> 
     </StmtSimple> 
     </Statements> 
    </Batch> 
    </BatchSequence> 
</ShowPlanXML>'; 

with xmlnamespaces(default 'http://schemas.microsoft.com/sqlserver/2004/07/showplan') 
select T.N.value('@Table', 'sysname') as TableName, 
     T.N.value('@Column', 'sysname') as ColumnName 
from @XML.nodes('//ColumnReference') as T(N) 

結果:

TableName   ColumnName   
-------------------- -------------------- 
[Table1]    Table1ID    
[Table1]    Name     
[Table2]    Name