1

30列を返すビューがあります。ビューは、3つのテーブルの内部結合によって作成されます。ビューを1行ずつ確認するのではなく、クエリを使用して、どの列がどのテーブルから取得されたかを確認したいと思います。SQL Server 2008でそれを行う方法はありますか?前もって感謝します

4

2 に答える 2

2

行ごとにビューを調べるのではなく、クエリを使用してどのテーブルからどの列が取得されたかを調べたい

いいえ、ありません。

データの元のテーブルが重要な場合は、ビューで列のエイリアスを使用して、データの元のテーブルを特定できます。

ただし、これはそもそもビューを持つ理由を無効にします。

于 2012-11-06T20:29:56.727 に答える
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                 
于 2012-11-07T07:03:33.563 に答える