<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>DB</title><link>http://blogs.wankuma.com/trapemiya/category/377.aspx</link><description>DB</description><managingEditor>trapemiya &lt;miya.hideki@nifty.com&gt;</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>trapemiya &lt;miya.hideki@nifty.com&gt;</dc:creator><title>【SQL】 SQL Server 2008のhierarchyidデータ型を使って階層毎に集計する。その２</title><link>http://blogs.wankuma.com/trapemiya/archive/2009/11/02/182655.aspx</link><pubDate>Mon, 02 Nov 2009 16:17:00 GMT</pubDate><guid>http://blogs.wankuma.com/trapemiya/archive/2009/11/02/182655.aspx</guid><wfw:comment>http://blogs.wankuma.com/trapemiya/comments/182655.aspx</wfw:comment><comments>http://blogs.wankuma.com/trapemiya/archive/2009/11/02/182655.aspx#Feedback</comments><slash:comments>633</slash:comments><wfw:commentRss>http://blogs.wankuma.com/trapemiya/comments/commentRss/182655.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/trapemiya/services/trackbacks/182655.aspx</trackback:ping><description>&lt;P&gt;&lt;A href="http://blogs.wankuma.com/trapemiya/archive/2009/10/29/182544.aspx"&gt;【SQL】 SQL Server 2008のhierarchyidデータ型を使って階層毎に集計する。&lt;/A&gt;&lt;BR&gt;&lt;A title=http://blogs.wankuma.com/trapemiya/archive/2009/10/29/182544.aspx HREF="/trapemiya/archive/2009/10/29/182544.aspx"&gt;http://blogs.wankuma.com/trapemiya/archive/2009/10/29/182544.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;の続きです。&lt;/P&gt;
&lt;P&gt;前回はSumAllSalesUnderMeという関数を用意し、自分の下のノードにぶら下がっている売上を全て集計していました。&lt;BR&gt;この関数を使うことによって任意のノードの総売り上げを簡単に求めることができます。これはこれは便利なのですが、組織全体について集計する際に、ノード毎にSumAllSalesUnderMeを用いて計算するのは非効率です。効率が良いのは、下の階層から上の階層に向かってノードの売上を順に足し込んでいくことでしょう。これを実現したのが以下になります。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;/* ノード毎に売上を集計し、ノード毎に売上を保持する一時テーブルを作成する。 */&lt;BR&gt;create table #temp&lt;BR&gt;(&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; TOrganizationID&amp;nbsp;&amp;nbsp;&amp;nbsp; int&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; not null,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; THierarchyid&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hierarchyid&amp;nbsp; not null,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; THierarchyLevel&amp;nbsp;&amp;nbsp;&amp;nbsp; int&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; not null,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; TOrganizationName&amp;nbsp; nvarchar(30) not null,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; TSales&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; not null&amp;nbsp; --このノードにぶら下がっている売上合計&lt;BR&gt;) 
&lt;P&gt;create unique clustered index tempIK01 on #temp(THierarchyLevel, THierarchyid); 
&lt;P&gt;declare @maxLevel int&lt;BR&gt;declare @level int; &lt;BR&gt;
&lt;P&gt;/* ノード毎に売上を集計し、#tempに放り込む。　*/ 
&lt;P&gt;select @maxLevel = MAX(OR01HierarchyLevel) from OR01Organization&lt;BR&gt;set @level = 0; 
&lt;P&gt;while @level &amp;lt;= @maxLevel&lt;BR&gt;begin&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; insert into #temp (TOrganizationID, THierarchyid, THierarchyLevel, TOrganizationName, TSales) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select OR01OrganizationID, OR01Hierarchyid, @level, OR01OrganizationName,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (select isnull(SUM(SA01Sales),0) from SA01Sales where SA01OrganizationID = OR01OrganizationID)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; from OR01Organization&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; where OR01HierarchyLevel = @level; 
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set @level = @level + 1;&lt;BR&gt;end &lt;BR&gt;
&lt;P&gt;/* 下の階層から上に向かってノードを順に足し込んでいく。&amp;nbsp; */ 
&lt;P&gt;set @level = @maxLevel; 
&lt;P&gt;while @level &amp;gt; 0&lt;BR&gt;begin&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; with CTE as&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select p.TSales pSales, c.ChildrenSales cSales&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; from #temp p&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; join (select t.THierarchyid.GetAncestor(1) hid, SUM(t.TSales) ChildrenSales&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; from #temp t&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; where t.THierarchyLevel = @level&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; group by t.THierarchyid.GetAncestor(1)) c&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; on p.THierarchyLevel =@level - 1 and p.THierarchyid = hid&lt;BR&gt;&amp;nbsp; )&lt;BR&gt;&amp;nbsp; update CTE set pSales = pSales + cSales;&lt;BR&gt;&amp;nbsp; SET @level = @level - 1;&lt;BR&gt;end &lt;BR&gt;
&lt;P&gt;/* 集計結果を表示する。 */&lt;BR&gt;&lt;BR&gt;select THierarchyid.ToString(),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; space(THierarchyLevel * 5) + TOrganizationName,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; THierarchyLevel,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TSales &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; from #temp&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; order by THierarchyid; 
&lt;P&gt;drop table #temp; 
&lt;P&gt;go 
&lt;P&gt;&lt;BR&gt;前回と全く同じ結果が得られます。&lt;/P&gt;
&lt;TABLE border=1 cellSpacing=0 cellPadding=2 width=402&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=100&gt;&lt;FONT color=#008000&gt;Path&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD vAlign=top width=159&gt;&lt;FONT color=#008000&gt;Name&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD vAlign=top width=41&gt;&lt;FONT color=#008000&gt;Level&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD vAlign=top width=100&gt;&lt;FONT color=#008000&gt;SubTotal&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=100&gt;/&lt;/TD&gt;
&lt;TD vAlign=top width=159&gt;全社&lt;/TD&gt;
&lt;TD vAlign=top width=41&gt;0&lt;/TD&gt;
&lt;TD vAlign=top width=100&gt;110000&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=100&gt;/1/&lt;/TD&gt;
&lt;TD vAlign=top width=159&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 東京支社&lt;/TD&gt;
&lt;TD vAlign=top width=41&gt;1&lt;/TD&gt;
&lt;TD vAlign=top width=100&gt;60000&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=100&gt;/1/1/&lt;/TD&gt;
&lt;TD vAlign=top width=159&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 統括事業部&lt;/TD&gt;
&lt;TD vAlign=top width=41&gt;2&lt;/TD&gt;
&lt;TD vAlign=top width=100&gt;60000&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=100&gt;/1/1/1/ &lt;/TD&gt;
&lt;TD vAlign=top width=159&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 営業１課&lt;/TD&gt;
&lt;TD vAlign=top width=41&gt;3&lt;/TD&gt;
&lt;TD vAlign=top width=100&gt;10000&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=100&gt;/1/1/2/ &lt;/TD&gt;
&lt;TD vAlign=top width=159&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 営業２課&lt;/TD&gt;
&lt;TD vAlign=top width=41&gt;3&lt;/TD&gt;
&lt;TD vAlign=top width=100&gt;50000&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=100&gt;/2/&amp;nbsp;&amp;nbsp; &lt;/TD&gt;
&lt;TD vAlign=top width=159&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 大阪支社&lt;/TD&gt;
&lt;TD vAlign=top width=41&gt;1&lt;/TD&gt;
&lt;TD vAlign=top width=100&gt;50000&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=100&gt;/2/1/ &lt;/TD&gt;
&lt;TD vAlign=top width=159&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 営業部&lt;/TD&gt;
&lt;TD vAlign=top width=41&gt;2&lt;/TD&gt;
&lt;TD vAlign=top width=100&gt;50000&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=100&gt;/2/1/1/ &lt;/TD&gt;
&lt;TD vAlign=top width=159&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 第１営業課&lt;/TD&gt;
&lt;TD vAlign=top width=41&gt;3&lt;/TD&gt;
&lt;TD vAlign=top width=100&gt;20000&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=100&gt;/2/1/2/ &lt;/TD&gt;
&lt;TD vAlign=top width=159&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 第２営業課&lt;/TD&gt;
&lt;TD vAlign=top width=41&gt;3&lt;/TD&gt;
&lt;TD vAlign=top width=100&gt;30000&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;
&lt;P&gt;本当はCTEの再帰でやりたかったんですが、CTEの再帰部分ではsumなどの集計関数が使えないため断念しました。orz&lt;BR&gt;CTEの再帰部分で集計関数とか外部結合とかできるようになるといいなぁ。細かい制約については以下を読んでください。&lt;BR&gt;&lt;BR&gt;WITH common_table_expression (Transact-SQL)&lt;BR&gt;&lt;A href="http://msdn.microsoft.com/ja-jp/library/ms175972.aspx"&gt;http://msdn.microsoft.com/ja-jp/library/ms175972.aspx&lt;/A&gt;&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/trapemiya/aggbug/182655.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>trapemiya &lt;miya.hideki@nifty.com&gt;</dc:creator><title>【SQL】 SQL Server 2008のhierarchyidデータ型を使って階層毎に集計する。</title><link>http://blogs.wankuma.com/trapemiya/archive/2009/10/29/182544.aspx</link><pubDate>Thu, 29 Oct 2009 15:05:00 GMT</pubDate><guid>http://blogs.wankuma.com/trapemiya/archive/2009/10/29/182544.aspx</guid><wfw:comment>http://blogs.wankuma.com/trapemiya/comments/182544.aspx</wfw:comment><comments>http://blogs.wankuma.com/trapemiya/archive/2009/10/29/182544.aspx#Feedback</comments><slash:comments>343</slash:comments><wfw:commentRss>http://blogs.wankuma.com/trapemiya/comments/commentRss/182544.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/trapemiya/services/trackbacks/182544.aspx</trackback:ping><description>&lt;P&gt;RDBのデータ型&lt;BR&gt;http://blogs.wankuma.com/ognac/archive/2009/10/28/182484.aspx 
&lt;P&gt;で、ついhierarchyid型について口走ってしまったので、以下にまとめてみました。どうせまとめようと思っていたので、良いきっかけになって良かったです。&lt;/P&gt;
&lt;P&gt;SQL Server 2008でhierarchyid型が追加されました。これによってレコードを階層構造で管理できるようになります。&lt;BR&gt;ここでは詳しく説明しませんので、ご存じない方はまず以下をご覧になると良いと思います。&lt;/P&gt;
&lt;P&gt;hierarchyid データ型の使用 (データベース エンジン)&lt;BR&gt;&lt;A href="http://msdn.microsoft.com/ja-jp/library/bb677173.aspx"&gt;http://msdn.microsoft.com/ja-jp/library/bb677173.aspx&lt;/A&gt;&lt;BR&gt;
&lt;P&gt;ここではhierarchyid型によって管理された階層構造毎に集計するデモを掲載します。ある会社の営業売上を階層毎に集計してみましょう。以下のような売上があるとします。&lt;/P&gt;
&lt;TABLE border=1 cellSpacing=0 cellPadding=2 width=401&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=75&gt;&lt;FONT color=#008000&gt;全社&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD vAlign=top width=79&gt;&lt;FONT color=#008000&gt;支社&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD vAlign=top width=79&gt;&lt;FONT color=#008000&gt;部&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD vAlign=top width=79&gt;&lt;FONT color=#008000&gt;課&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD vAlign=top width=87&gt;&lt;FONT color=#008000&gt;売上&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=75&gt;全社&lt;/TD&gt;
&lt;TD vAlign=top width=79&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=79&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=79&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=87&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=75&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=79&gt;東京支社&lt;/TD&gt;
&lt;TD vAlign=top width=79&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=79&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=87&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=75&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=79&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=79&gt;統括事業部&lt;/TD&gt;
&lt;TD vAlign=top width=79&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=87&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=75&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=79&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=79&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=79&gt;営業１課&lt;/TD&gt;
&lt;TD vAlign=top width=87&gt;10000&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=75&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=79&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=79&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=79&gt;営業２課&lt;/TD&gt;
&lt;TD vAlign=top width=87&gt;50000&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=75&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=79&gt;大阪支社&lt;/TD&gt;
&lt;TD vAlign=top width=79&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=79&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=87&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=75&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=79&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=79&gt;営業部&lt;/TD&gt;
&lt;TD vAlign=top width=79&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=87&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=75&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=79&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=79&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=79&gt;第１営業課&lt;/TD&gt;
&lt;TD vAlign=top width=87&gt;20000&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=75&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=82&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=85&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=88&gt;第２営業課&lt;/TD&gt;
&lt;TD vAlign=top width=95&gt;30000&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;
&lt;P&gt;
&lt;P&gt;目標は以下のように階層毎に集計することです。&lt;/P&gt;
&lt;TABLE border=1 cellSpacing=0 cellPadding=2 width=502&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=77&gt;&lt;FONT color=#008000&gt;全社&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD vAlign=top width=82&gt;&lt;FONT color=#008000&gt;支社&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD vAlign=top width=80&gt;&lt;FONT color=#008000&gt;部&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD vAlign=top width=80&gt;&lt;FONT color=#008000&gt;課&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD vAlign=top width=97&gt;&lt;FONT color=#008000&gt;売上&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD vAlign=top width=84&gt;&lt;FONT color=#008000&gt;集計&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=77&gt;全社&lt;/TD&gt;
&lt;TD vAlign=top width=81&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=80&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=80&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=97&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=84&gt;110000&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=77&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=81&gt;東京支社&lt;/TD&gt;
&lt;TD vAlign=top width=80&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=80&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=97&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=84&gt;60000&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=77&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=81&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=80&gt;統括事業部&lt;/TD&gt;
&lt;TD vAlign=top width=80&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=97&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=84&gt;60000&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=78&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=81&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=79&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=79&gt;営業１課&lt;/TD&gt;
&lt;TD vAlign=top width=97&gt;10000&lt;/TD&gt;
&lt;TD vAlign=top width=83&gt;10000&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=78&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=81&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=79&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=79&gt;営業２課&lt;/TD&gt;
&lt;TD vAlign=top width=97&gt;50000&lt;/TD&gt;
&lt;TD vAlign=top width=83&gt;50000&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=78&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=81&gt;大阪支社&lt;/TD&gt;
&lt;TD vAlign=top width=79&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=79&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=97&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=83&gt;50000&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=78&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=81&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=79&gt;営業部&lt;/TD&gt;
&lt;TD vAlign=top width=79&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=97&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=83&gt;50000&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=78&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=81&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=79&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=79&gt;第１営業課&lt;/TD&gt;
&lt;TD vAlign=top width=97&gt;20000&lt;/TD&gt;
&lt;TD vAlign=top width=83&gt;20000&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=78&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=84&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=84&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=86&gt;第２営業課&lt;/TD&gt;
&lt;TD vAlign=top width=105&gt;30000&lt;/TD&gt;
&lt;TD vAlign=top width=90&gt;30000&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;以上を実現するために組織と組織の売上という二つのテーブルを作成します。&lt;/P&gt;
&lt;P&gt;まずは組織テーブルからです。hierarchyid型を使用して作成します。&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;create table OR01Organization&lt;BR&gt;(&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; OR01OrganizationID&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; identity (1,1)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; not null&amp;nbsp; primary key,&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; OR01Hierarchyid&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hierarchyid&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; not null,&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; OR01HierarchyLevel&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; as OR01Hierarchyid.GetLevel() ,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; OR01OrganizationName&amp;nbsp;&amp;nbsp; nvarchar(30)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; not null&amp;nbsp;&amp;nbsp; &lt;BR&gt;)&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;ここではOR01Hierarchyidを主キーにしていませんので、インデックスを作成しておきます。&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;create unique index OR01OrganizationIK01 on OR01Organization (OR01Hierarchyid)&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;続いて売上テーブルを作成します。組織テーブルとの間に参照整合性制約を作成しています。&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;create table SA01Sales&lt;BR&gt;(&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SA01SalesID&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int&amp;nbsp; identity (1,1)&amp;nbsp; not null primary key,&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SA01OrganizationID&amp;nbsp;&amp;nbsp; int&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; not null,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SA01Sales&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int&amp;nbsp;&amp;nbsp; &lt;BR&gt;) &lt;/P&gt;
&lt;P&gt;alter table SA01Sales&lt;BR&gt;add constraint SA01SalesFK01 foreign key (SA01OrganizationID)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; references OR01Organization(OR01OrganizationID) 
&lt;P&gt;&lt;BR&gt;データを作成します。&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;insert into OR01Organization (OR01Hierarchyid, OR01OrganizationName) values&lt;BR&gt;(hierarchyid::GetRoot(), '全社'),&lt;BR&gt;('/1/', '東京支社'),&lt;BR&gt;('/1/1/', '統括事業部'),&lt;BR&gt;('/1/1/1/', '営業１課'),&lt;BR&gt;('/1/1/2/', '営業２課'),&lt;BR&gt;('/2/', '大阪支社'),&lt;BR&gt;('/2/1/', '営業部'),&lt;BR&gt;('/2/1/1/', '第１営業課'),&lt;BR&gt;('/2/1/2/', '第２営業課') 
&lt;P&gt;
&lt;P&gt;ここまで出来たら一度組織図を表示してみましょう。&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;select OR01Hierarchyid.ToString() as Path,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OR01OrganizationName as Name,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OR01HierarchyLevel as Level&lt;BR&gt;&amp;nbsp; from OR01Organization order by OR01Hierarchyid 
&lt;P&gt;&lt;BR&gt;以下のように表示されればＯＫです。&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;Path&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Level&lt;BR&gt;/&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 全社&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&lt;BR&gt;/1/&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 東京支社&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&lt;BR&gt;/1/1/&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 統括事業部&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2&lt;BR&gt;/1/1/1/&amp;nbsp;&amp;nbsp;&amp;nbsp; 営業１課&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3&lt;BR&gt;/1/1/2/&amp;nbsp;&amp;nbsp;&amp;nbsp; 営業２課&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3&lt;BR&gt;/2/&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 大阪支社&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&lt;BR&gt;/2/1/&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 営業部&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2&lt;BR&gt;/2/1/1/&amp;nbsp;&amp;nbsp;&amp;nbsp; 第１営業課&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3&lt;BR&gt;/2/1/2/&amp;nbsp;&amp;nbsp;&amp;nbsp; 第２営業課&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3 
&lt;P&gt;&lt;BR&gt;Nameにインデントが無くて見難い場合には、以下のようにLevel毎に適当に頭に空白を入れると良いでしょう。&lt;/P&gt;
&lt;P&gt;space(OR01HierarchyLevel * 5) + OR01OrganizationName as Name&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;では次に売上データを作成していきます。&lt;/P&gt;
&lt;P&gt;SA01OrganizationIDはOR01OrganizationIDを指定しますが、OR01OrganizationIDは自動インクリメント（オートナンバー）なので、レコードが追加された順に1, 2, 3, ・・・となります。&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;insert into SA01Sales (SA01OrganizationID, SA01Sales) values&lt;BR&gt;(4, 10000),&amp;nbsp;&amp;nbsp; --東京支社　営業１課&lt;BR&gt;(5, 50000),&amp;nbsp;&amp;nbsp; --東京支社　営業２課&lt;BR&gt;(8, 20000),&amp;nbsp;&amp;nbsp; --大阪支社　第１営業課&lt;BR&gt;(9, 30000)&amp;nbsp;&amp;nbsp;&amp;nbsp; --大阪支社　第２営業課 
&lt;P&gt;&lt;BR&gt;さて、いよいよ階層毎の集計をします。階層の集計は、自分にぶら下がっている全ての子供の売上データの合計になります。OR01Hierarchyidというhierarchyid型を辿れば、自分にぶら下がっている全ての子供である組織データが見つかります。&lt;BR&gt;その見つかった組織データにぶら下がっている売上データを合計すれば目的が達せられます。&lt;BR&gt;これを実現した関数が以下になります。&lt;BR&gt;CTE内では外部結合ができませんので、select文を使って売上データを求めています。&lt;BR&gt;
&lt;P&gt;create function SumAllSalesUnderMe&lt;BR&gt;(&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @hierarchyid as hierarchyid&lt;BR&gt;)&lt;BR&gt;returns bigint&lt;BR&gt;as&lt;BR&gt;begin 
&lt;P&gt;declare @compwk bigint; 
&lt;P&gt;with CTE(CTEHierarchyid, CTESales)&lt;BR&gt;AS&lt;BR&gt;(&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; select&amp;nbsp; OR01Hierarchyid, (select SA01Sales from SA01Sales as Sa1 where Sa1.SA01OrganizationID = OR01OrganizationID)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; from OR01Organization &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; where OR01Hierarchyid = @hierarchyid&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; union all&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; select&amp;nbsp; OR01Hierarchyid, (select SA01Sales from SA01Sales as Sa2 where Sa2.SA01OrganizationID = Or1.OR01OrganizationID)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; from OR01Organization as Or1&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; inner join CTE as c on c.CTEHierarchyid = Or1.OR01Hierarchyid.GetAncestor(1)&lt;BR&gt;) 
&lt;P&gt;select @compwk = sum(CTESales) from CTE 
&lt;P&gt;return @compwk 
&lt;P&gt;end 
&lt;P&gt;&lt;BR&gt;これで全ての準備が整いました。以下のようにselect文を発行すれば、階層毎に集計された結果が得られます。&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;select OR01Hierarchyid.ToString() as Path,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; space(OR01HierarchyLevel * 5) + OR01OrganizationName as Name,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OR01HierarchyLevel as Level,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dbo.SumAllSalesUnderMe(OR01Hierarchyid) as SubTotal&lt;BR&gt;&amp;nbsp; from OR01Organization order by OR01Hierarchyid&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;TABLE border=1 cellSpacing=0 cellPadding=2 width=400&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=100&gt;&lt;FONT color=#008000&gt;Path&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD vAlign=top width=159&gt;&lt;FONT color=#008000&gt;Name&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD vAlign=top width=41&gt;&lt;FONT color=#008000&gt;Level&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD vAlign=top width=100&gt;&lt;FONT color=#008000&gt;SubTotal&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=100&gt;/&lt;/TD&gt;
&lt;TD vAlign=top width=159&gt;全社&lt;/TD&gt;
&lt;TD vAlign=top width=41&gt;0&lt;/TD&gt;
&lt;TD vAlign=top width=100&gt;110000&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=100&gt;/1/&lt;/TD&gt;
&lt;TD vAlign=top width=159&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 東京支社&lt;/TD&gt;
&lt;TD vAlign=top width=41&gt;1&lt;/TD&gt;
&lt;TD vAlign=top width=100&gt;60000&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=100&gt;/1/1/&lt;/TD&gt;
&lt;TD vAlign=top width=159&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 統括事業部&lt;/TD&gt;
&lt;TD vAlign=top width=41&gt;2&lt;/TD&gt;
&lt;TD vAlign=top width=100&gt;60000&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=100&gt;/1/1/1/ &lt;/TD&gt;
&lt;TD vAlign=top width=159&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 営業１課&lt;/TD&gt;
&lt;TD vAlign=top width=41&gt;3&lt;/TD&gt;
&lt;TD vAlign=top width=100&gt;10000&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=100&gt;/1/1/2/ &lt;/TD&gt;
&lt;TD vAlign=top width=159&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 営業２課&lt;/TD&gt;
&lt;TD vAlign=top width=41&gt;3&lt;/TD&gt;
&lt;TD vAlign=top width=100&gt;50000&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=100&gt;/2/&amp;nbsp;&amp;nbsp; &lt;/TD&gt;
&lt;TD vAlign=top width=159&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 大阪支社&lt;/TD&gt;
&lt;TD vAlign=top width=41&gt;1&lt;/TD&gt;
&lt;TD vAlign=top width=100&gt;50000&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=100&gt;/2/1/ &lt;/TD&gt;
&lt;TD vAlign=top width=159&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 営業部&lt;/TD&gt;
&lt;TD vAlign=top width=41&gt;2&lt;/TD&gt;
&lt;TD vAlign=top width=100&gt;50000&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=100&gt;/2/1/1/ &lt;/TD&gt;
&lt;TD vAlign=top width=159&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 第１営業課&lt;/TD&gt;
&lt;TD vAlign=top width=41&gt;3&lt;/TD&gt;
&lt;TD vAlign=top width=100&gt;20000&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=100&gt;/2/1/2/ &lt;/TD&gt;
&lt;TD vAlign=top width=159&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 第２営業課&lt;/TD&gt;
&lt;TD vAlign=top width=41&gt;3&lt;/TD&gt;
&lt;TD vAlign=top width=100&gt;30000&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;img src ="http://blogs.wankuma.com/trapemiya/aggbug/182544.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>trapemiya &lt;miya.hideki@nifty.com&gt;</dc:creator><title>【SQL】 Insert文の行コンストラクタ （テーブル値コンストラクタ）</title><link>http://blogs.wankuma.com/trapemiya/archive/2009/10/21/182290.aspx</link><pubDate>Wed, 21 Oct 2009 12:06:00 GMT</pubDate><guid>http://blogs.wankuma.com/trapemiya/archive/2009/10/21/182290.aspx</guid><wfw:comment>http://blogs.wankuma.com/trapemiya/comments/182290.aspx</wfw:comment><comments>http://blogs.wankuma.com/trapemiya/archive/2009/10/21/182290.aspx#Feedback</comments><slash:comments>30</slash:comments><wfw:commentRss>http://blogs.wankuma.com/trapemiya/comments/commentRss/182290.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/trapemiya/services/trackbacks/182290.aspx</trackback:ping><description>&lt;P&gt;何をいまさら感が漂いますが、SQL Server 2008では一つのInsert文で複数の行を挿入できるようになったんですね。知りませんでした。&lt;/P&gt;
&lt;P&gt;insert into Customers (Id, Name) values (1, 'Boo')&lt;BR&gt;insert into Customers (Id, Name) values (2, 'Foo')&lt;BR&gt;insert into Customers (Id, Name) values (3, 'Woo') 
&lt;P&gt;は、以下のように書けます。 
&lt;P&gt;insert into Customers (Id, Name) &lt;BR&gt;values&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (1, 'Boo'),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (2, 'Foo'),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (3, 'Woo') 
&lt;P&gt;このように複数指定できる形式を、行コンストラクタ またはテーブル値コンストラクタと呼ぶようです。&lt;/P&gt;
&lt;P&gt;（参考）&lt;BR&gt;INSERT (Transact-SQL)&lt;BR&gt;&lt;A href="http://msdn.microsoft.com/ja-jp/library/ms174335.aspx"&gt;http://msdn.microsoft.com/ja-jp/library/ms174335.aspx&lt;/A&gt;&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/trapemiya/aggbug/182290.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>trapemiya &lt;miya.hideki@nifty.com&gt;</dc:creator><title>えムナウさんの宿題</title><link>http://blogs.wankuma.com/trapemiya/archive/2009/04/07/170922.aspx</link><pubDate>Tue, 07 Apr 2009 15:07:00 GMT</pubDate><guid>http://blogs.wankuma.com/trapemiya/archive/2009/04/07/170922.aspx</guid><wfw:comment>http://blogs.wankuma.com/trapemiya/comments/170922.aspx</wfw:comment><comments>http://blogs.wankuma.com/trapemiya/archive/2009/04/07/170922.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/trapemiya/comments/commentRss/170922.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/trapemiya/services/trackbacks/170922.aspx</trackback:ping><description>&lt;P&gt;データベースを設計する&lt;BR&gt;&lt;A href="http://blogs.wankuma.com/rti/archive/2009/04/07/170910.aspx"&gt;http://blogs.wankuma.com/rti/archive/2009/04/07/170910.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;地方在住だとなかなか勉強会にはいけないので、せめて宿題だけでも考えてみる。&lt;BR&gt;幸い期末をくぐり抜けて、やっと今日は少し時間に余裕があるv(^^)&lt;BR&gt;&lt;BR&gt;----------------------&lt;BR&gt;先生マスター&lt;BR&gt;先生Id&lt;BR&gt;氏名&lt;/P&gt;
&lt;P&gt;----------------------&lt;BR&gt;教科マスター&lt;BR&gt;教科Id&lt;BR&gt;教科名&lt;/P&gt;
&lt;P&gt;----------------------&lt;BR&gt;場所マスター&lt;BR&gt;場所Id&lt;BR&gt;場所名&lt;/P&gt;
&lt;P&gt;----------------------&lt;BR&gt;先生教科テーブル&lt;BR&gt;先生教科テーブルId&lt;BR&gt;先生Id（外部キー：先生マスター.先生Id）&lt;BR&gt;教科Id（外部キー：教科マスター.教科Id）&lt;BR&gt;担当教科フラグ（担当教科ならtrue）&lt;/P&gt;
&lt;P&gt;----------------------&lt;BR&gt;教科場所テーブル&lt;BR&gt;教科場所テーブルId&lt;BR&gt;教科Id（外部キー：教科マスター.教科Id）&lt;BR&gt;場所Id（外部キー：場所マスター.場所Id）&lt;/P&gt;
&lt;P&gt;----------------------&lt;BR&gt;時間割りテーブル&lt;BR&gt;時間割りId&lt;BR&gt;曜日&lt;BR&gt;時限&lt;BR&gt;教科Id（外部キー：教科マスター.教科Id）&lt;/P&gt;
&lt;P&gt;＃教科を各クラスで行う場合は、場所テーブルに「各クラス」というレコードを作成し、それを利用する。&lt;BR&gt;&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/trapemiya/aggbug/170922.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>trapemiya &lt;miya.hideki@nifty.com&gt;</dc:creator><title>SQL Server 2008において、時刻情報を削除して本日の日付のみを求めるには？</title><link>http://blogs.wankuma.com/trapemiya/archive/2008/09/04/155521.aspx</link><pubDate>Thu, 04 Sep 2008 16:57:00 GMT</pubDate><guid>http://blogs.wankuma.com/trapemiya/archive/2008/09/04/155521.aspx</guid><wfw:comment>http://blogs.wankuma.com/trapemiya/comments/155521.aspx</wfw:comment><comments>http://blogs.wankuma.com/trapemiya/archive/2008/09/04/155521.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.wankuma.com/trapemiya/comments/commentRss/155521.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/trapemiya/services/trackbacks/155521.aspx</trackback:ping><description>&lt;P&gt;SQL Server 2005 までは本日の日付のみを得るために、以下のようにして時刻部分を削除していました。&lt;/P&gt;
&lt;P&gt;convert(smalldatetime, convert (nvarchar, getdate() , 111), 120)&lt;/P&gt;
&lt;P&gt;SQL Server 2008からはdate型が追加されたので、以下でいいようですね。&lt;/P&gt;
&lt;P&gt;convert&amp;nbsp;(date, getdate())&lt;/P&gt;
&lt;P&gt;ところで、datetime型やsmalldatetime型の場合は時刻情報が邪魔をして思ったようにレコードが抽出されず、バグにつながりやすかったのですが、date型を使えばこのような心配はいりません。何気にdate型は素晴らしいです。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/trapemiya/aggbug/155521.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>trapemiya &lt;miya.hideki@nifty.com&gt;</dc:creator><title>サポート技術情報のRSSって新着サポート技術情報だけになっちゃったんだね？</title><link>http://blogs.wankuma.com/trapemiya/archive/2008/07/29/150792.aspx</link><pubDate>Tue, 29 Jul 2008 12:13:00 GMT</pubDate><guid>http://blogs.wankuma.com/trapemiya/archive/2008/07/29/150792.aspx</guid><wfw:comment>http://blogs.wankuma.com/trapemiya/comments/150792.aspx</wfw:comment><comments>http://blogs.wankuma.com/trapemiya/archive/2008/07/29/150792.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.wankuma.com/trapemiya/comments/commentRss/150792.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/trapemiya/services/trackbacks/150792.aspx</trackback:ping><description>&lt;P&gt;久しぶりにサポート技術情報のRSS一覧を見に行ったら見つからない。あれ？どこだっけな？と探すこと小一時間。その間に気になる記事とかつまみ食いしてたこともありますが・・・。&lt;BR&gt;あまりにも見つからないので検索対象を広げたところ、Jittaさんのブログ発見。&lt;/P&gt;
&lt;P&gt;マイクロソフト サポート情報の RSS フィード &lt;BR&gt;&lt;A href="http://blogs.wankuma.com/jitta/archive/2008/07/17/149421.aspx"&gt;http://blogs.wankuma.com/jitta/archive/2008/07/17/149421.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;あれ～、無くなっちゃったのね。なんでだろー。&lt;BR&gt;とりあえずJittaさんのおかげで解決。多謝。&lt;BR&gt;たぶんこのJittaさんの記事、一度はタイトルだけは見てるはずなんだけど、さくっと通り過ぎてたなぁ。&lt;BR&gt;それにしても直近でナイスな記事でした。この記事が無かったらお昼ご飯が遅れてたもの。&lt;/P&gt;
&lt;P&gt;というわけで現在正式に表に出ているのは、ＭＳＤＮホームのトップページにあるサポート技術情報のRSSだけかな？これはどうも新着サポート技術情報のRSSのようです。&lt;/P&gt;
&lt;P&gt;じゃっ、お昼ごはんということで。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/trapemiya/aggbug/150792.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>trapemiya &lt;miya.hideki@nifty.com&gt;</dc:creator><title>ある期間が他の期間と重なっているかを調べるには？</title><link>http://blogs.wankuma.com/trapemiya/archive/2008/03/24/129326.aspx</link><pubDate>Mon, 24 Mar 2008 14:10:00 GMT</pubDate><guid>http://blogs.wankuma.com/trapemiya/archive/2008/03/24/129326.aspx</guid><wfw:comment>http://blogs.wankuma.com/trapemiya/comments/129326.aspx</wfw:comment><comments>http://blogs.wankuma.com/trapemiya/archive/2008/03/24/129326.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.wankuma.com/trapemiya/comments/commentRss/129326.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/trapemiya/services/trackbacks/129326.aspx</trackback:ping><description>&lt;P&gt;例えば契約期間が抽出条件で指定された期間と重なっているかどうかを調べるには、&lt;/P&gt;
&lt;P&gt;契約期間開始日 &amp;lt;= 抽出期間終了日 and 契約期間終了日 &amp;gt;= 抽出期間開始日&lt;/P&gt;
&lt;P&gt;というのはよく使うのですが、&lt;/P&gt;
&lt;P&gt;（契約期間開始日と抽出期間開始日の大きい方） &amp;lt;= （契約期間終了日と抽出期間終了日の小さい方）&lt;/P&gt;
&lt;P&gt;というのでも可能です。後者の方が比較の数が多く効率が悪いので考えたこともなかったのですが、メリットとしては重なっている期間を得ることができます。逆に言えば、抽出条件に指定するだけなら後者の出番はないと思うんですが、たまにwhere句で見かけます。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/trapemiya/aggbug/129326.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>trapemiya &lt;miya.hideki@nifty.com&gt;</dc:creator><title>【T-SQL】TRY...CATCHをそのまま使うとエラーを握りつぶし、呼び出し元アプリケーションにエラーが伝搬しない。</title><link>http://blogs.wankuma.com/trapemiya/archive/2008/03/13/127556.aspx</link><pubDate>Thu, 13 Mar 2008 16:11:00 GMT</pubDate><guid>http://blogs.wankuma.com/trapemiya/archive/2008/03/13/127556.aspx</guid><wfw:comment>http://blogs.wankuma.com/trapemiya/comments/127556.aspx</wfw:comment><comments>http://blogs.wankuma.com/trapemiya/archive/2008/03/13/127556.aspx#Feedback</comments><slash:comments>673</slash:comments><wfw:commentRss>http://blogs.wankuma.com/trapemiya/comments/commentRss/127556.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/trapemiya/services/trackbacks/127556.aspx</trackback:ping><description>&lt;P&gt;ストアドプロシージャ内で普通にTRY...CATCHを使用するとそこでエラーを握りつぶしてしまい、呼び出し元アプリケーションにエラーがあったことが伝わらない。&lt;BR&gt;例えば以下のように書くとエラーを握りつぶしてしまう。&lt;/P&gt;
&lt;P&gt;BEGIN TRY&amp;nbsp;&lt;BR&gt;&amp;nbsp;　　BEGIN TRANSACTION&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;　　--なんとかかんとか&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; COMMIT TRANSACTION&lt;BR&gt;END TRY&lt;BR&gt;BEGIN CATCH&lt;BR&gt;&amp;nbsp;　　ROLLBACK TRANSACTION&lt;BR&gt;END CATCH&lt;/P&gt;
&lt;P&gt;この対処方法がBooks Onlineに載っている。&lt;/P&gt;
&lt;P&gt;Transact-SQL での TRY...CATCH の使用&lt;BR&gt;&lt;A href="http://msdn2.microsoft.com/ja-jp/library/ms179296.aspx"&gt;http://msdn2.microsoft.com/ja-jp/library/ms179296.aspx&lt;/A&gt;&lt;BR&gt;の&lt;BR&gt;「TRY...CATCH での RAISERROR の指定」に書かれている。&lt;BR&gt;それによると、CATCHで捕まえた後、RAISERRORを利用してエラーを再スローしなきゃいけないようだ。&lt;BR&gt;で、再スローするためのストアドプロシージャの例が載っている。これを以下に引用する。&lt;/P&gt;
&lt;P&gt;CREATE PROCEDURE usp_RethrowError AS&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Return if there is no error information to retrieve.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF ERROR_NUMBER() IS NULL&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RETURN;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DECLARE &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @ErrorMessage&amp;nbsp;&amp;nbsp;&amp;nbsp; NVARCHAR(4000),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @ErrorNumber&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; INT,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @ErrorSeverity&amp;nbsp;&amp;nbsp; INT,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @ErrorState&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; INT,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @ErrorLine&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; INT,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @ErrorProcedure&amp;nbsp; NVARCHAR(200);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Assign variables to error-handling functions that &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- capture information for RAISERROR.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @ErrorNumber = ERROR_NUMBER(),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @ErrorSeverity = ERROR_SEVERITY(),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @ErrorState = ERROR_STATE(),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @ErrorLine = ERROR_LINE(),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @ErrorProcedure = ISNULL(ERROR_PROCEDURE(), '-');&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Building the message string that will contain original&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- error information.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT @ErrorMessage = &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; N'Error %d, Level %d, State %d, Procedure %s, Line %d, ' + &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'Message: '+ ERROR_MESSAGE();&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Raise an error: msg_str parameter of RAISERROR will contain&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- the original error information.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; RAISERROR &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @ErrorMessage, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @ErrorSeverity, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @ErrorNumber,&amp;nbsp;&amp;nbsp;&amp;nbsp; -- parameter: original error number.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @ErrorSeverity,&amp;nbsp; -- parameter: original error severity.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @ErrorState,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- parameter: original error state.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @ErrorProcedure, -- parameter: original error procedure name.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @ErrorLine&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- parameter: original error line number.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; );&lt;/P&gt;
&lt;P&gt;で、これを利用して以下のようにすると、ストアドプロシージャの呼び出し元アプリケーションにめでたくエラーが伝わる。&lt;/P&gt;
&lt;P&gt;BEGIN TRY&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; BEGIN TRANSACTION&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp; --なんとかかんとか&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; COMMIT TRANSACTION&lt;BR&gt;END TRY&lt;BR&gt;BEGIN CATCH&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ROLLBACK TRANSACTION&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Call the procedure to raise the original error.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; EXEC usp_RethrowError;&amp;nbsp;&lt;BR&gt;END CATCH&lt;/P&gt;
&lt;P&gt;で、ここで疑問なのが、なぜusp_RethrowErrorなんていうストアドプロシージャをわざわざ作らなきゃならないのだろう？&lt;BR&gt;最初からRETHROWERRORなんていうステートメントを用意しといてくれたらいいのに。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/trapemiya/aggbug/127556.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>trapemiya &lt;miya.hideki@nifty.com&gt;</dc:creator><title>ネストしたトランザクションの処理</title><link>http://blogs.wankuma.com/trapemiya/archive/2008/01/31/120250.aspx</link><pubDate>Thu, 31 Jan 2008 21:58:00 GMT</pubDate><guid>http://blogs.wankuma.com/trapemiya/archive/2008/01/31/120250.aspx</guid><wfw:comment>http://blogs.wankuma.com/trapemiya/comments/120250.aspx</wfw:comment><comments>http://blogs.wankuma.com/trapemiya/archive/2008/01/31/120250.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.wankuma.com/trapemiya/comments/commentRss/120250.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/trapemiya/services/trackbacks/120250.aspx</trackback:ping><description>&lt;P&gt;ネストしたトランザクションにおいては、内側のトランザクションでは常にCOMMITし、外側のトランザクションで内側のトランザクションからの通知（戻り値など）によって、COMMITするかROLL BACKすれば良いのか。これによって、ネストしたトランザクション全体が制御されることになる。&lt;/P&gt;
&lt;P&gt;「EXECUTE 後のトランザクション数は、 COMMIT TRAN または ROLLBACK TRAN ステートメントに間違いがあることを示しています。以前の数 = 1、現在の数 = 0 です。」&lt;/P&gt;
&lt;P&gt;というエラーメッセージが出て焦った(^^;&lt;/P&gt;
&lt;P&gt;以下のページに多謝　m(_ _)m&lt;/P&gt;
&lt;P&gt;SQL Server 2000でのコネクション／トランザクション問題&lt;BR&gt;&lt;A href="http://d.hatena.ne.jp/PoohKid/20060608/p2"&gt;http://d.hatena.ne.jp/PoohKid/20060608/p2&lt;/A&gt;&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/trapemiya/aggbug/120250.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>trapemiya &lt;miya.hideki@nifty.com&gt;</dc:creator><title>SQL Server 2005でも列のエイリアスをwhere句に使えないんですね・・・</title><link>http://blogs.wankuma.com/trapemiya/archive/2008/01/25/119171.aspx</link><pubDate>Fri, 25 Jan 2008 11:57:00 GMT</pubDate><guid>http://blogs.wankuma.com/trapemiya/archive/2008/01/25/119171.aspx</guid><wfw:comment>http://blogs.wankuma.com/trapemiya/comments/119171.aspx</wfw:comment><comments>http://blogs.wankuma.com/trapemiya/archive/2008/01/25/119171.aspx#Feedback</comments><slash:comments>27</slash:comments><wfw:commentRss>http://blogs.wankuma.com/trapemiya/comments/commentRss/119171.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/trapemiya/services/trackbacks/119171.aspx</trackback:ping><description>&lt;P&gt;例えば、&lt;/P&gt;
&lt;P&gt;select hoge t from table1 where t = 1&lt;/P&gt;
&lt;P&gt;といったように、列のエイリアスがwhere句で使えない。上記は、&lt;/P&gt;
&lt;P&gt;select hoge t from table1 where hoge = 1&lt;/P&gt;
&lt;P&gt;と書かなければならない。上の例では簡単なので列のエイリアスをwhere句で使えないことがあまり不便に感じられないかもしれない。しかし、以下のようにサブクエリを含んだ場合はとたんに冗長度が増す。実際にはテーブル名の前にスキーマ名も付くだろうし、サブクエリももっと複雑になるだろうから、さらに冗長度が増してしまう。&lt;/P&gt;
&lt;P&gt;select (select table2age from table2 where table2id = table1id) table1age from table1&lt;BR&gt;&amp;nbsp;&amp;nbsp; where (select table2age from table2 where table2id = table1id) &amp;gt;= 20&lt;/P&gt;
&lt;P&gt;本当は、以下のように書きたい。&lt;/P&gt;
&lt;P&gt;select (select table2age from table2 where table2id = table1id) t_age from table1&lt;BR&gt;&amp;nbsp;&amp;nbsp; where t_age &amp;gt;= 20&lt;/P&gt;
&lt;P&gt;なぜ、今でも列のエイリアスがwhere句で使えないのだろう？ 一見すると簡単に思えるのだが、そんなに難しいのだろうか？&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/trapemiya/aggbug/119171.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>