<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>SQLServer &#8211; REONTOSANTA</title>
	<atom:link href="https://knowledge.reontosanta.com/archives/category/database/sqlserver/feed" rel="self" type="application/rss+xml" />
	<link>https://knowledge.reontosanta.com</link>
	<description>Collection of personal knowledge</description>
	<lastBuildDate>Tue, 17 Jul 2018 03:52:50 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	
	<atom:link rel='hub' href='https://knowledge.reontosanta.com/?pushpress=hub'/>
<site xmlns="com-wordpress:feed-additions:1">83369280</site>	<item>
		<title>SQLServerで断片化の状態に応じてIndexを再構築する</title>
		<link>https://knowledge.reontosanta.com/archives/1056</link>
					<comments>https://knowledge.reontosanta.com/archives/1056#respond</comments>
		
		<dc:creator><![CDATA[mogice]]></dc:creator>
		<pubDate>Tue, 30 May 2017 06:15:28 +0000</pubDate>
				<category><![CDATA[SQLServer]]></category>
		<guid isPermaLink="false">http://knowledge.reontosanta.com/?p=1056</guid>

					<description><![CDATA[SQLServerにおいて、インデックスが断片化してしまうとクエリの&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<p>SQLServerにおいて、インデックスが断片化してしまうとクエリのパフォーマンスが低下してくる。</p>
<p>インデックスの再構成(Reorganize)や再構築(Rebuild)を行うと断片化が解消される為、定期的にインデックスの再構成(Reorganize)や再構築(Rebuild)をすることでこれを解決することができる。</p>
<p>ただし、やみくもにデータベース内の全てのインデックスを再構成(Reorganize)や再構築(Rebuild)するとデータベースの規模が大きいほど、実行に多くの時間がかかってしまったり、ログファイルが大きくなりすぎてしまう。</p>
<p>そこで、断片化の状態を判断して再構成(Reorganize)または再構築(Rebuild)をする。</p>
<p>まず、インデックスの断片化の状態は <b>sys.dm_db_index_physical_stats </b>を使って調べることができる。</p>
<p><b>sys.dm_db_index_physical_stats </b>が返す <b>avg_fragmentation_in_percent </b>は論理的な断片化(インデックス内で順序が乱れたページ)の割合を示していて、再構成(Reorganize)または再構築(Rebuild)をするべきかどうかの判断の指標とすることができる。</p>
<p>例えば、以下のようなクエリで再構成(Reorganize)のクエリ、再構築(Rebuild)のクエリ、スキーマ名、テーブル名、インデックス名、インデックスID、オブジェクト内のパーティション番号、断片化の割合、インデックスページまたはデータページの合計数を取得することができる。</p>
<p><b>avg_fragmentation_in_percent &gt; 10</b> を指定することで、断片化率が 10 % 以上のインデックスを取得している。</p><pre class="urvanov-syntax-highlighter-plain-tag">SELECT
  'ALTER INDEX [' + C.name + '] ON [' + D.name + '].[' + B.name + '] REORGANIZE' AS ReorganizeCmd 
  , 'ALTER INDEX [' + C.name + '] ON [' + D.name + '].[' + B.name + '] REBUILD' AS RebuildCmd
  , D.name AS schemaname
  , B.name AS table_name
  , C.name AS index_name
  , C.index_id
  , A.partition_number
  , A.avg_fragmentation_in_percent
  , A.page_count 
FROM
  sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, NULL) AS A 
  INNER JOIN sys.objects AS B 
    ON A.object_id = B.object_id 
  INNER JOIN sys.indexes AS C 
    ON A.object_id = C.object_id 
    AND A.index_id = C.index_id 
  INNER JOIN sys.schemas D 
    ON B.schema_id = D.schema_id 
WHERE
  B.type = 'U' 
  AND C.index_id &gt; 0 
  AND A.page_count &gt; 1000 
  AND A.avg_fragmentation_in_percent &gt; 10 
ORDER BY
  A.avg_fragmentation_in_percent DESC</pre><p>インデックスの断片化の状態がわかったら、それによってインデックスを再構成(Reorganize)するか、または再構築(Rebuild)するか決定する。</p>
<p>例えば、10% 以上 30% 未満であれば再構成(Reorganize)、 30% 以上であれば再構築(Rebuild)するとすれば、上記のクエリで再構成のクエリ、または再構築のクエリを生成してそれぞれ実行する。</p>
<div class="knowl-after-content-ad" style="margin-top: 40px;" id="knowl-337146592"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="2719999442" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><div class="knowl-after-content-relation" id="knowl-1992299667"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="7848218644" 
data-ad-format="autorelaxed"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://knowledge.reontosanta.com/archives/1056/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1056</post-id>	</item>
		<item>
		<title>SQLServerで1つのクエリにより複数行をinsertする</title>
		<link>https://knowledge.reontosanta.com/archives/1015</link>
					<comments>https://knowledge.reontosanta.com/archives/1015#respond</comments>
		
		<dc:creator><![CDATA[mogice]]></dc:creator>
		<pubDate>Tue, 07 Mar 2017 05:26:18 +0000</pubDate>
				<category><![CDATA[SQLServer]]></category>
		<guid isPermaLink="false">http://knowledge.reontosanta.com/?p=1015</guid>

					<description><![CDATA[1つのクエリで、複数行をinsertする SQLServer2008&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<h2>1つのクエリで、複数行をinsertする</h2>
<p>SQLServer2008以降では、INSERT文で追加行をカンマでつなげることで実現できる。</p>
<p>なお、一度に追加できる最大行数は、1000行となる。</p><pre class="urvanov-syntax-highlighter-plain-tag">INSERT 
INTO test_table(col1, col2) 
VALUES
  (value1, value2)
  , (value1, value2)</pre><p>&nbsp;</p>
<p>ちなみに、SQLServer2005以前では複数行のINSERTは動作しないので、以下のような方法をとることになる。</p><pre class="urvanov-syntax-highlighter-plain-tag">INSERT 
INTO dbo.MyTable(C1, C2) 
SELECT
  Value1
  , Value2 
UNION ALL 
SELECT
  Value1
  , Value2 
UNION ALL 
SELECT
  Value1
  , Value2</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<div class="knowl-after-content-ad" style="margin-top: 40px;" id="knowl-1602088750"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="2719999442" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><div class="knowl-after-content-relation" id="knowl-450787447"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="7848218644" 
data-ad-format="autorelaxed"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://knowledge.reontosanta.com/archives/1015/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1015</post-id>	</item>
		<item>
		<title>SQLServerで日付範囲から日(または月)ごとのデータを作成する</title>
		<link>https://knowledge.reontosanta.com/archives/1013</link>
					<comments>https://knowledge.reontosanta.com/archives/1013#respond</comments>
		
		<dc:creator><![CDATA[mogice]]></dc:creator>
		<pubDate>Mon, 13 Feb 2017 23:29:39 +0000</pubDate>
				<category><![CDATA[SQLServer]]></category>
		<guid isPermaLink="false">http://knowledge.reontosanta.com/?p=1013</guid>

					<description><![CDATA[日付範囲から日ごと、または月ごとに年月日(月ごとの場合、日は1日)を&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<h2>日付範囲から日ごと、または月ごとに年月日(月ごとの場合、日は1日)を作成する</h2>
<p>”2017年1月1日から2017年1月31日まで”のようなFrom/Toの日付範囲があり、そこからカレンダーのように日ごとのデータを取得したい場合、以下のような共通テーブル式(CTE:Common Table Expression)を利用した再帰クエリで作成することができる。</p><pre class="urvanov-syntax-highlighter-plain-tag">WITH DateTable(MyDate) AS ( 
  SELECT
    CONVERT(DATETIME, '2017/01/01') 
  UNION ALL 
  SELECT
    DATEADD(d, 1, MyDate) 
  FROM
    DateTable 
  WHERE
    MyDate &lt; CONVERT(DATETIME, '2017/01/31')
) 
SELECT
  MyDate 
FROM
  DateTable</pre><p>&nbsp;</p>
<p>また、月ごと(日は1日)にデータを取得したい場合は以下のクエリで作成できる。</p><pre class="urvanov-syntax-highlighter-plain-tag">WITH MonthTable(YearMonth) AS ( 
  SELECT
    CONVERT(DATETIME, '2016/12/01') 
  UNION ALL 
  SELECT
    DATEADD(m, 1, YearMonth) 
  FROM
    MonthTable 
  WHERE
    YearMonth &lt; CONVERT(DATETIME, '2017/03/01')
) 
SELECT
  YearMonth 
FROM
  MonthTable</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<div class="knowl-after-content-ad" style="margin-top: 40px;" id="knowl-2633835571"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="2719999442" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><div class="knowl-after-content-relation" id="knowl-1200391675"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="7848218644" 
data-ad-format="autorelaxed"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://knowledge.reontosanta.com/archives/1013/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1013</post-id>	</item>
		<item>
		<title>SQLServerでdatetimeデータ型から日付部分のみを取得する</title>
		<link>https://knowledge.reontosanta.com/archives/1019</link>
					<comments>https://knowledge.reontosanta.com/archives/1019#respond</comments>
		
		<dc:creator><![CDATA[mogice]]></dc:creator>
		<pubDate>Tue, 10 Jan 2017 03:19:38 +0000</pubDate>
				<category><![CDATA[SQLServer]]></category>
		<guid isPermaLink="false">http://knowledge.reontosanta.com/?p=1019</guid>

					<description><![CDATA[datetimeデータ型から日付部分のみを取得する [crayon-&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<h2>datetimeデータ型から日付部分のみを取得する</h2>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">SELECT GETDATE()</pre><p>上記のクエリを実行すると、&#8221;2017-01-10 17:13:05&#8243;のように日付と時刻が取得される。</p>
<p>SQLServer2008以降であれば、以下のクエリで日付だけを取得することができる。</p><pre class="urvanov-syntax-highlighter-plain-tag">SELECT CONVERT(date, getdate())</pre><p>このクエリを実行すると、&#8221;2017-01-10&#8243;を取得することができる。</p>
<p>&nbsp;</p>
<div class="knowl-after-content-ad" style="margin-top: 40px;" id="knowl-1170396743"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="2719999442" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><div class="knowl-after-content-relation" id="knowl-4247998216"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="7848218644" 
data-ad-format="autorelaxed"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://knowledge.reontosanta.com/archives/1019/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1019</post-id>	</item>
		<item>
		<title>SQLServerで日付の曜日を取得する</title>
		<link>https://knowledge.reontosanta.com/archives/970</link>
					<comments>https://knowledge.reontosanta.com/archives/970#respond</comments>
		
		<dc:creator><![CDATA[mogice]]></dc:creator>
		<pubDate>Thu, 24 Nov 2016 00:32:45 +0000</pubDate>
				<category><![CDATA[SQLServer]]></category>
		<guid isPermaLink="false">http://knowledge.reontosanta.com/?p=970</guid>

					<description><![CDATA[SQLServerでは、曜日を「月曜日」、「火曜日」など文字列で取得&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<p>SQLServerでは、曜日を「月曜日」、「火曜日」など文字列で取得する方法と、曜日を表す数字で取得する方法の２つがある。</p>
<p>&nbsp;</p>
<h2>曜日を文字列で取得する</h2>
<p>曜日を「月曜日」、「火曜日」などの文字列で取得するには、DATENAME関数を使用する。</p><pre class="urvanov-syntax-highlighter-plain-tag">SELECT DATENAME(WEEKDAY, GETDATE());</pre><p>※WEEKDAYは、DWでも可(取得対象とするdateの要素を指定)</p>
<p>&nbsp;</p>
<div class="knowl-content" style="margin-top: 40px;" id="knowl-2221652093"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="4196732648" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><h2>曜日を表す数字を取得する</h2>
<p>曜日を曜日を表す数字で取得する場合は、DATEPART関数を使用する。</p><pre class="urvanov-syntax-highlighter-plain-tag">SELECT DATEPART(WEEKDAY, GETDATE());</pre><p>※WEEKDAYは、DWでも可(取得対象とするdateの要素を指定)</p>
<h4>曜日と数字の対応表</h4>

<table id="tablepress-26" class="tablepress tablepress-id-26">
<thead>
<tr class="row-1">
	<th class="column-1">曜日</th><th class="column-2">返される数字</th>
</tr>
</thead>
<tbody class="row-striping row-hover">
<tr class="row-2">
	<td class="column-1">日曜日</td><td class="column-2">1</td>
</tr>
<tr class="row-3">
	<td class="column-1">月曜日</td><td class="column-2">2</td>
</tr>
<tr class="row-4">
	<td class="column-1">火曜日</td><td class="column-2">3</td>
</tr>
<tr class="row-5">
	<td class="column-1">水曜日</td><td class="column-2">4</td>
</tr>
<tr class="row-6">
	<td class="column-1">木曜日</td><td class="column-2">5</td>
</tr>
<tr class="row-7">
	<td class="column-1">金曜日</td><td class="column-2">6</td>
</tr>
<tr class="row-8">
	<td class="column-1">土曜日</td><td class="column-2">7</td>
</tr>
</tbody>
</table>

<p>曜日を表す数字は、CASE式を使って以下のように文字列に変換することができる。</p><pre class="urvanov-syntax-highlighter-plain-tag">SELECT 
  CASE DATEPART(WEEKDAY, GETDATE()) 
       WHEN 1 THEN 'Sun' 
       WHEN 2 THEN 'Mon' 
       WHEN 3 THEN 'Tue' 
       WHEN 4 THEN 'Wed' 
       WHEN 5 THEN 'Thu' 
       WHEN 6 THEN 'Fri' 
       WHEN 7 THEN 'Sat' 
  END</pre><p>※WEEKDAYは、DWでも可(取得対象とするdateの要素を指定)</p>
<p>&nbsp;</p>
<div class="knowl-after-content-ad" style="margin-top: 40px;" id="knowl-1371428260"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="2719999442" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><div class="knowl-after-content-relation" id="knowl-1682242944"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="7848218644" 
data-ad-format="autorelaxed"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://knowledge.reontosanta.com/archives/970/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">970</post-id>	</item>
		<item>
		<title>SQLServerで数値判定</title>
		<link>https://knowledge.reontosanta.com/archives/968</link>
					<comments>https://knowledge.reontosanta.com/archives/968#respond</comments>
		
		<dc:creator><![CDATA[mogice]]></dc:creator>
		<pubDate>Mon, 07 Nov 2016 01:16:35 +0000</pubDate>
				<category><![CDATA[SQLServer]]></category>
		<guid isPermaLink="false">http://knowledge.reontosanta.com/?p=968</guid>

					<description><![CDATA[式が数値型として有効かどうかを調べるには、ISNUMERICを利用す&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<p>式が数値型として有効かどうかを調べるには、ISNUMERICを利用する。</p><pre class="urvanov-syntax-highlighter-plain-tag">ISNUMERIC(expression)</pre><p>expressionが有効な数値型ならば戻り値1、それ以外は戻り値0となる。</p>
<p>※プラス(&#8216;+&#8217;)、マイナス(&#8216;-&#8216;)、通貨記号(&#8216;$&#8217;等)、指数表記(&#8216;E&#8217;、&#8217;D&#8217;)も数値として認識される。</p>
<p>&nbsp;</p>
<h2><strong>サンプル(WHERE句で利用)</strong></h2>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">SELECT * FROM target_table WHERE ISNUMERIC(target_column) = 1</pre><p>実行結果は、target_columnが数値型のものだけが抽出される。</p>
<p>&nbsp;</p>
<div class="knowl-after-content-ad" style="margin-top: 40px;" id="knowl-2770036083"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="2719999442" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><div class="knowl-after-content-relation" id="knowl-3827189466"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="7848218644" 
data-ad-format="autorelaxed"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://knowledge.reontosanta.com/archives/968/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">968</post-id>	</item>
		<item>
		<title>SQLServerで値の丸めを行う</title>
		<link>https://knowledge.reontosanta.com/archives/933</link>
					<comments>https://knowledge.reontosanta.com/archives/933#respond</comments>
		
		<dc:creator><![CDATA[mogice]]></dc:creator>
		<pubDate>Tue, 02 Aug 2016 02:03:38 +0000</pubDate>
				<category><![CDATA[SQLServer]]></category>
		<guid isPermaLink="false">http://knowledge.reontosanta.com/?p=933</guid>

					<description><![CDATA[SQLServerで値の丸め(切り上げ・切り捨て・四捨五入)を行うに&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<p>SQLServerで値の丸め(切り上げ・切り捨て・四捨五入)を行うには、FLOOR、CELLING、ROUNDといったファンクションを利用する。</p>
<ul>
<li>FLOOR<br />
整数への切り上げを行う<br />
第1引数：対象の値(数値)</li>
<li>CELLING<br />
整数への切り捨てを行う<br />
第1引数：対象の値(数値)</li>
<li>ROUND<br />
四捨五入を行う<br />
第1引数：対象の値(数値)<br />
第2引数：数値を丸める際の有効桁数(例：-1→10の位、0→1の位、1→小数点第一位)<br />
第3引数：オプション機能(0：四捨五入、0以外：切り捨て／デフォルト(未指定)は0)</li>
</ul>
<p>&nbsp;</p>
<h2>整数への切り上げ・切り捨て・四捨五入</h2>
<p>整数への切り上げ・切り捨て・四捨五入は特に意識することなく各ファンクションを利用する。</p>
<p>＜切り上げ＞</p><pre class="urvanov-syntax-highlighter-plain-tag">SELECT CEILING(1.4); --&gt; 2
SELECT CEILING(1.5); --&gt; 2
SELECT CEILING(1.01); --&gt; 2</pre><p>＜切り捨て＞</p><pre class="urvanov-syntax-highlighter-plain-tag">SELECT FLOOR(1.4); --&gt; 1
SELECT FLOOR(1.5); --&gt; 1
SELECT ROUND(1.4, 0, 1); --&gt; 1.0
SELECT ROUND(1.5, 0, 1); --&gt; 1.0</pre><p>＜四捨五入＞</p><pre class="urvanov-syntax-highlighter-plain-tag">SELECT ROUND(1.4, 0); --&gt; 1.0
SELECT ROUND(1.5, 0); --&gt; 2.0</pre><p>&nbsp;</p>
<div class="knowl-content" style="margin-top: 40px;" id="knowl-2591777488"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="4196732648" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><h2>小数点第二位への切り上げ・切り捨て・四捨五入</h2>
<p>小数点以下の単位で切り捨て・四捨五入を行うには、ROUNDを利用することで可能。</p>
<p>ただし、切り上げについては、一度整数に変換してCEILINGで切り上げを行った後、改めて元の精度に戻すなどの工夫が必要となる。</p>
<p>＜切り上げ＞</p><pre class="urvanov-syntax-highlighter-plain-tag">SELECT CEILING(1.004 * 100) / 100 --&gt; 1.010000
SELECT CEILING(1.005 * 100) / 100 --&gt; 1.010000
SELECT CEILING(1.0001 * 100) / 100 --&gt; 1.010000</pre><p>＜切り捨て＞</p><pre class="urvanov-syntax-highlighter-plain-tag">SELECT ROUND(1.004, 2, 1); --&gt; 1.000
SELECT ROUND(1.005, 2, 1); --&gt; 1.000</pre><p>＜四捨五入＞</p><pre class="urvanov-syntax-highlighter-plain-tag">SELECT ROUND(1.004, 2); --&gt; 1.000
SELECT ROUND(1.005, 2); --&gt; 1.010</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<div class="knowl-after-content-ad" style="margin-top: 40px;" id="knowl-4282562379"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="2719999442" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><div class="knowl-after-content-relation" id="knowl-4267726895"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="7848218644" 
data-ad-format="autorelaxed"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://knowledge.reontosanta.com/archives/933/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">933</post-id>	</item>
		<item>
		<title>SQLServerで複数DBをバックアップ＆リストア</title>
		<link>https://knowledge.reontosanta.com/archives/801</link>
					<comments>https://knowledge.reontosanta.com/archives/801#respond</comments>
		
		<dc:creator><![CDATA[mogice]]></dc:creator>
		<pubDate>Sun, 24 Jan 2016 23:35:58 +0000</pubDate>
				<category><![CDATA[SQLServer]]></category>
		<guid isPermaLink="false">http://knowledge.reontosanta.com/?p=801</guid>

					<description><![CDATA[SQLServerで「Transact-SQL」を利用して、複数のD&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<p>SQLServerで「Transact-SQL」を利用して、複数のDBのバックアップを取得し、リストアを行う方法について。</p>
<p>&nbsp;</p>
<h2>バックアップの取得</h2>
<p>バックアップ元のSQLServerで以下のクエリを実行する。</p>
<p>※「ｓｙｓｄａｔａｂａｓｅｓ」は、全角となっているので半角に変更して実行</p><pre class="urvanov-syntax-highlighter-plain-tag">use master
go
/*************/
/* バックアップ対象ＤＢ名を控える変数 */
/*************/
DECLARE @dbname varchar(80);
/**************/
/* バックアップ対象ＤＢ一覧を取得するカーソル */
/**************/
DECLARE DbNameList CURSOR FOR
select name from ｓｙｓｄａｔａｂａｓｅｓ
/********/
/* ＤＢの完全バックアップ取得を開始 */
/********/
OPEN DbNameList;
print '開始';
/************/
/* バックアップ対象となるＤＢ名を取得 */
/************/
FETCH NEXT FROM DbNameList INTO @dbname;
WHILE @@FETCH_STATUS = 0
BEGIN
    IF @dbname &lt;&gt; 'tempdb' and @dbname &lt;&gt; 'pubs' and @dbname &lt;&gt; 'Northwind' and @dbname &lt;&gt; 'msdb' and @dbname &lt;&gt; 'model' and @dbname &lt;&gt; 'master' 
    BEGIN
        /************/
        /* ＤＢの完全バックアップ */
        /************/
        print '→バックアップ対象ＤＢ：' + @dbname;
        EXEC ('BACKUP DATABASE [' + @dbname + '] TO DISK = ''D:\TEMP\MSSQL\MSSQL_' + @dbname + '_full.bak'' WITH STATS;');
    END;
    /*************/
    /* 次のバックアップ対象となるＤＢ名を取得 */
    /*************/
    FETCH NEXT FROM DbNameList INTO @dbname;
END;
CLOSE DbNameList;
DEALLOCATE DbNameList;
print '終了';
GO</pre><p>&nbsp;</p>
<div class="knowl-content" style="margin-top: 40px;" id="knowl-3703560400"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="4196732648" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><h2>バックアップ対象リストの取得</h2>
<p>バックアップ元のSQLServerで以下のクエリを実行する。</p>
<p>※「ｓｙｓｄａｔａｂａｓｅｓ」は、全角となっているので半角に変更して実行</p><pre class="urvanov-syntax-highlighter-plain-tag">use master
go
/*************/
/* バックアップ対象ＤＢ名を控える変数 */
/*************/
DECLARE @dbname varchar(80);
DECLARE @dbList varchar(1000);
/**************/
/* バックアップ対象ＤＢ一覧を取得するカーソル */
/**************/
DECLARE DbNameList CURSOR FOR
select name from ｓｙｓｄａｔａｂａｓｅｓ
/********/
/* バックアップ対象DBのリストアップを開始 */
/********/
OPEN DbNameList;
/************/
/* バックアップ対象となるＤＢ名を取得 */
/************/
FETCH NEXT FROM DbNameList INTO @dbname;
SET @dbList = ''
WHILE @@FETCH_STATUS = 0
BEGIN
    /************/
    /* バックアップ対象ＤＢのリストを出力 */
    /************/
    /* システムDB以外の場合 */
    IF @dbname &lt;&gt; 'tempdb' and @dbname &lt;&gt; 'pubs' and @dbname &lt;&gt; 'Northwind' and @dbname &lt;&gt; 'msdb' and @dbname &lt;&gt; 'model' and @dbname &lt;&gt; 'master' 
        BEGIN
            /* バックアップ対象DBの場合 */
            IF @dbname &lt;&gt; 'XXX' and @dbname &lt;&gt; 'YYY' and @dbname &lt;&gt; 'ZZZ'
                BEGIN
                    IF @dbList &lt;&gt; ''
                        SET @dbList = @dbList + '|';
                    SET @dbList = @dbList + @dbname;
                END
        END
    /*************/
    /* 次のバックアップ対象となるＤＢ名を取得 */
    /*************/
    FETCH NEXT FROM DbNameList INTO @dbname;
END;
print 'SELECT @dbNameAll = ''' + @dbList + ''''
CLOSE DbNameList;
DEALLOCATE DbNameList;
GO</pre><p>&nbsp;</p>
<h2>リストア</h2>
<p>リストア先のSQLServerで以下のクエリを実行する。</p><pre class="urvanov-syntax-highlighter-plain-tag">use master
go
--変数定義
DECLARE @dbNameAll varchar(1000); --データベースの名称リスト
DECLARE @bkPath varchar(100); --読み込みバックアップファイルのPATH
DECLARE @outPath varchar(100); --mdf、ldfファイルの配置先（PATH）
DECLARE @dbname varchar(100); --データベースの名称
DECLARE @bkFname varchar(200); -- 読み込みバックアップファイルのPATH + ファイル名
DECLARE @mdfName varchar(100); --mdfファイルの名称
DECLARE @ldfName varchar(100); --ldfファイルの名称
DECLARE @outMdf varchar(200); --mdfファイルのPATH + ファイル名
DECLARE @outLdf varchar(200); --ldfファイルのPATH + ファイル名
--データベースの名称リスト
SELECT @dbNameAll = 'ReportServer|ReportServerTempDB|JDB|KAIGAI|KANSA|KYOIKU|TEIAN|JDBT|AUTOREGI|AUTOREGI_T'
--読み込みバックアップファイルのPATH
SELECT @bkPath = 'D:\TEMP\MSSQL\'
--mdf、ldfファイルの配置先（PATH）
SELECT @outPath = 'D:\MSSQL\'
print '開始';
WHILE @dbNameAll &lt;&gt; ''
BEGIN
    --データベースの名称セット
    IF charindex('|', @dbNameAll) &gt; 0 
        BEGIN
            set @dbname = ltrim(rtrim( substring(@dbNameAll, 1, charindex('|',@dbNameAll)-1) )) ;
            set @dbNameAll = ltrim(rtrim( substring(@dbNameAll, charindex('|',@dbNameAll)+1, len(@dbNameAll)) ));
        END
    ELSE
        BEGIN
            set @dbname = @dbNameAll;
            set @dbNameAll = '';
        END
    --ログ出力
    print ''
    print '****************リストアＤＢ：' + @dbname;
    --読み込みDISKのファイル名
    IF @dbname = 'AAA'
        --データベースの論理名とファイル名が異なる場合（論理名が「AAA」、ファイル名が「BBB.mdf」「BBB_log.ldf」）
        BEGIN
            SELECT @bkFname = @bkPath + 'MSSQL_' + @dbname + '_full.bak'
            SELECT @mdfName = 'BBB'
            SELECT @ldfName = 'BBB_log'
            SELECT @outMdf = @outPath + @dbname + '.mdf'
            SELECT @outLdf = @outPath + @dbname + '.ldf'
        END
    ELSE IF @dbname = 'XXX'
        --データベースの論理名とファイル名が異なる場合（論理名が「XXX」、ファイル名が「YYY.mdf」「YYY_log.ldf」）
        BEGIN
            SELECT @bkFname = @bkPath + 'MSSQL_' + @dbname + '_full.bak'
            SELECT @mdfName = 'YYY'
            SELECT @ldfName = 'YYY_log'
            SELECT @outMdf = @outPath + @dbname + '.mdf'
            SELECT @outLdf = @outPath + @dbname + '.ldf'
        END
    ELSE
        --データベースの論理名とファイル名が同じ場合
        BEGIN
            SELECT @bkFname = @bkPath + 'MSSQL_' + @dbname + '_full.bak'
            SELECT @mdfName = @dbname
            SELECT @ldfName = @dbname + '_log'
            SELECT @outMdf = @outPath + @mdfName + '.mdf'
            SELECT @outLdf = @outPath + @ldfName + '.ldf'
        END
    --リストア実行
    RESTORE DATABASE @dbname --復元するデータベースの名称
        FROM DISK = @bkFname --復元元ファイル名
        WITH
            REPLACE --同じ名称のデータベースがあれば、既存を削除
            , MOVE @mdfName TO @outMdf
            , MOVE @ldfName TO @outLdf
END;
print '終了';
GO</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<div class="knowl-after-content-ad" style="margin-top: 40px;" id="knowl-367511904"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="2719999442" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><div class="knowl-after-content-relation" id="knowl-494999053"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="7848218644" 
data-ad-format="autorelaxed"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://knowledge.reontosanta.com/archives/801/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">801</post-id>	</item>
		<item>
		<title>SQLServerで主キー（PRIMARY KEY制約）を設定する</title>
		<link>https://knowledge.reontosanta.com/archives/789</link>
					<comments>https://knowledge.reontosanta.com/archives/789#respond</comments>
		
		<dc:creator><![CDATA[mogice]]></dc:creator>
		<pubDate>Mon, 18 Jan 2016 23:30:47 +0000</pubDate>
				<category><![CDATA[SQLServer]]></category>
		<guid isPermaLink="false">http://knowledge.reontosanta.com/?p=789</guid>

					<description><![CDATA[SQLServerで主キー（PRIMARY KEY制約）を設定する方&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<p>SQLServerで主キー（PRIMARY KEY制約）を設定する方法について。</p>
<p>&nbsp;</p>
<h2>SQLServerManagementStudioを利用する方法</h2>
<ol>
<li>オブジェクトエクスプローラーで主キーを設定する対象テーブルを右クリックして、[デザイン]を選択</li>
<li>表示されたテーブルデザイナーで、主キーとして設定する列を選択（複数列を選択する場合は、Ctrlキーを押しながらクリック）</li>
<li>選択対象を右クリックして、[主キーの設定]をクリック（メニューの[テーブルデザイナー]⇒[主キーの設定]でも可）</li>
</ol>
<p>※主キーを削除する場合は、主キーが設定されている列を選択した状態で[主キーの削除]を実施する</p>
<p>&nbsp;</p>
<div class="knowl-content" style="margin-top: 40px;" id="knowl-884512157"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="4196732648" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><h2>Transact-SQLを利用する方法</h2>
<p>主キーを設定するクエリの書式</p><pre class="urvanov-syntax-highlighter-plain-tag">ALTER TABLE [テーブル名] ADD PRIMARY KEY ([列名]...)</pre><p>サンプル</p><pre class="urvanov-syntax-highlighter-plain-tag">USE [DB1]
GO
ALTER TABLE [table1] ADD PRIMARY KEY ([col1], [col2])
GO</pre><p>主キーを削除するクエリの書式</p><pre class="urvanov-syntax-highlighter-plain-tag">ALTER TABLE [テーブル名] DROP CONSTRAINT [キー名]</pre><p>サンプル</p><pre class="urvanov-syntax-highlighter-plain-tag">USE [DB1]
GO
ALTER TABLE [table1] DROP CONSTRAINT [PK_table1]
GO</pre><p>&nbsp;</p>
<h2>主キー（PRIMARY KEY制約）の設定に関わる注意点</h2>
<ul>
<li>テーブルに含めることができるPRIMARY KEY制約は1つだけ</li>
<li>PRIMARY KEY制約中で定義する列はすべて、NOT NULLとして定義する必要がある</li>
<li>NULL値を許容するかどうかを指定しない場合、PRIMARY KEY制約の影響を受けるすべての列は、NOT NULLに設定される</li>
<li>主キーが設定された新しいテーブルを作成するには、データベースのCREATE TABLE権限と、テーブルを作成するスキーマのALTER権限が必要</li>
<li>既存のテーブルに主キーを作成するには、テーブルに対するALTER権限が必要</li>
</ul>
<p>&nbsp;</p>
<div class="knowl-after-content-ad" style="margin-top: 40px;" id="knowl-3826466249"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="2719999442" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><div class="knowl-after-content-relation" id="knowl-3270554148"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="7848218644" 
data-ad-format="autorelaxed"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://knowledge.reontosanta.com/archives/789/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">789</post-id>	</item>
		<item>
		<title>SQLServerで同一インスタンス内にデータベースを複製する</title>
		<link>https://knowledge.reontosanta.com/archives/786</link>
					<comments>https://knowledge.reontosanta.com/archives/786#respond</comments>
		
		<dc:creator><![CDATA[mogice]]></dc:creator>
		<pubDate>Sun, 15 Nov 2015 23:26:48 +0000</pubDate>
				<category><![CDATA[SQLServer]]></category>
		<guid isPermaLink="false">http://knowledge.reontosanta.com/?p=786</guid>

					<description><![CDATA[同一インスタンス内でデータベースの複製を行うには、SQLServer&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<p>同一インスタンス内でデータベースの複製を行うには、SQLServerの[SQL Server Management Studiio]で、[バックアップ]と[復元]の機能を利用する。</p>
<p>任意のデータベースのバックアップを元に新しいデータベースを復元する。</p>
<p>複製先のデータベースは事前に作成する必要はなく、復元を行うと自動的に作成される。</p>
<p>&nbsp;</p>
<h2>複製の手順</h2>
<p>複製元のデータベース(DB1)を右クリックして、[タスク]⇒[バックアップ]を実行する。<br />
バックアップファイル:DB1.bak</p>
<p>対象インスタンスの[データベース]を右クリックして、[ファイルおよびファイルグループの復元]を実行する。</p>
<p>＜全般＞<br />
復元先データベース:DB2　※直接入力（事前に作っておく必要はない）<br />
復元元データベース:DB1　※バックアップを行ったデータベース<br />
復元するバックアップセットの選択：対象のバックアップの[復元]にチェックを入れる</p>
<p>＜オプション＞<br />
既存のデータベースを上書きする:ON<br />
次のデータベースファイルに復元（変更可）<br />
行データ:任意のファイルパスのmdfファイル<br />
ログ:任意のldfファイル</p>
<p>&nbsp;</p>
<div class="knowl-after-content-ad" style="margin-top: 40px;" id="knowl-1150146481"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="2719999442" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><div class="knowl-after-content-relation" id="knowl-3766866169"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="7848218644" 
data-ad-format="autorelaxed"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://knowledge.reontosanta.com/archives/786/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">786</post-id>	</item>
	</channel>
</rss>
