<?xml version="1.0" encoding="utf-8" ?><rss version="2.0">
<channel>
<title>SQL Server 入門</title>
<link>https://sql55.com/</link>
<language>ja</language>
<item><title>▶️ SQL Server 2025 と SSMS のインストール方法【接続確認まで】</title><link>https://youtu.be/iMMKlpa4K5U?si=4Qz7IApihZ8ddSnM</link><description>この動画では、Windows 環境に Microsoft SQL Server 2025 と SQL Server Management Studio（SSMS）をインストールし、実際にサーバーに接続できるところまでを解説します。&lt;br&gt;&lt;br&gt;・SQL Server 2025 のエディション選び（Developer / Express の違い）&lt;br&gt;・インストーラーのダウンロード方法&lt;br&gt;・SQL Server 2025 のインストール手順&lt;br&gt;・SSMS のダウンロードとインストール&lt;br&gt;・インストール後に SSMS から接続し、簡単なクエリで動作確認&lt;br&gt;&lt;br&gt;学習用・検証用の開発環境をこれから用意したい方向けの内容です。&lt;br&gt;当チャンネルでは、今後 SQL Server Agent の使い方なども取り上げていきますので、SQL Server 2025 Developer エディションをインストールしています。&lt;br&gt;商用利用はできない点にご注意ください。&lt;br&gt;Express エディションでも SQL の基本的な学習は可能です。&lt;br&gt;</description><pubDate>Mon, 08 Dec 2025 12:00:00 GMT</pubDate><category>YouTube動画</category></item>
<item><title>SQL Server で BULK INSERT を使って CSV を取り込む方法と注意点</title><link>https://sql55.com/query/bulk-insert.php</link><description>test</description><pubDate>Mon, 10 Nov 2025 04:46:00 GMT</pubDate><category>便利なT-SQL＆クエリー集</category></item>
<item><title>SQL Server の有効桁数 (precision) と 小数点以下桁数 (scale) について</title><link>https://sql55.com/column/sql-server-precision-and-scale.php</link><description>SQL Server の有効桁数 (precision) と 小数点以下桁数 (scale) について&lt;br&gt;&lt;br&gt;SQL Server入門書&lt;br&gt;有効桁数 (precision) と 小数点以下桁数 (scale)&lt;br&gt;DECIMAL を使った計算列を作った時などに、有効桁数 (precision) と 小数点以下桁数 (scale) がなぜそれになったのかな、と思ったことはありませんか？&lt;br&gt;&lt;br&gt;SQL Server では、DECIMAL の値の計算の結果がどのような有効桁数と小数点以下桁数になるかのルールがあります。&lt;br&gt;&lt;br&gt;この記事では、SQL Server の有効桁数と小数点以下桁数についてと、DECIMAL の計算結果の有効桁数と小数点以下桁数のルールについてご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;有効桁数 (precision) と 小数点以下桁数 (scale) とは？&lt;br&gt;DECIMAL の計算結果のデータ型のルール&lt;br&gt;和・差・積・商の有効桁数と小数点以下桁数のルール&lt;br&gt;足し算の計算結果の有効桁数と小数点以下桁数&lt;br&gt;引き算の計算結果の有効桁数と小数点以下桁数&lt;br&gt;掛け算の計算結果の有効桁数と小数点以下桁数&lt;br&gt;割り算の計算結果の有効桁数と小数点以下桁数&lt;br&gt;</description><pubDate>Tue, 26 Aug 2025 01:50:00 GMT</pubDate><category>SQL Server＆T-SQLに関するコラム</category></item>
<item><title>SQL Server の計算列 (Computed Column) の使い方と注意点</title><link>https://sql55.com/t-sql/sql-server-computed-column.php</link><description>SQL Server の計算列 (Computed Column) の使い方と注意点&lt;br&gt;&lt;br&gt;SQL Server の計算列 (Computed Column)&lt;br&gt;データベースのテーブルを設計する時に、他のカラムの値を使って計算した結果をカラムとして持たせたいような時ありませんか？&lt;br&gt;&lt;br&gt;例えば、注文の情報を持つ Orders テーブルに OrderQty（注文個数）とUnitPrice（単価）のカラムがあって、OrderQty * UnitPrice で計算された OrderAmount（注文金額）というようなカラムを持たせたいような時です。&lt;br&gt;&lt;br&gt;そんなときに便利なのが、計算列 (Computed Column) です。&lt;br&gt;&lt;br&gt;この記事では、計算列の基本的な使い方と注意点などをご説明します。&lt;br&gt;</description><pubDate>Tue, 19 Aug 2025 02:42:00 GMT</pubDate><category>T-SQL 入門</category></item>
<item><title>SQL Server - 外部キーと参照先の一覧を取得する方法</title><link>https://sql55.com/query/sql-server-get-foreign-keys-with-references.php</link><description>SQL Server - 外部キーと参照先の一覧を取得する方法&lt;br&gt;&lt;br&gt;SQL Server で外部キーと参照先の一覧を取得する方法&lt;br&gt;SQL Server で開発をしていて、マスター側の仕様変更などで、変更の影響を調べるのに、そのマスターデータを参照している外部キーの一覧を取得したいような状況ありませんか？&lt;br&gt;&lt;br&gt;この記事では、SQL Server で外部キーと参照先の一覧を取得する方法をご紹介します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;システムカタログビューを使う方法&lt;br&gt;システムストアドプロシージャを使う方法&lt;br&gt;システムカタログビューを使う方法&lt;br&gt;SQL Server では、sys.foreign_keys や sys.foreign_key_columns などのシステムカタログビューを使って、外部キーと参照先の一覧を取得することが</description><pubDate>Mon, 11 Aug 2025 05:15:00 GMT</pubDate><category>便利なT-SQL＆クエリー集</category></item>
<item><title>T-SQL - よく使う CREATE TABLE と ALTER TABLE のクエリーのまとめ</title><link>https://sql55.com/query/t-sql-create-and-alter-table.php</link><description>T-SQL - よく使う CREATE TABLE と ALTER TABLE のクエリーのまとめ&lt;br&gt;&lt;br&gt;SQL Server hosting&lt;br&gt;よく使う CREATE TABLE と ALTER TABLE 文&lt;br&gt;SQL Server で開発をしていると、クエリーでテーブルを作成したり変更したりする機会が出てくると思います。&lt;br&gt;&lt;br&gt;ここでは、私も実際によく使う CREATE TABLE と ALTER TABLE 文をまとめておきたいと思います。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;CREATE TABLE: 主キーを作成&lt;br&gt;CREATE TABLE: 主キーに名前をつけて作成&lt;br&gt;CREATE TABLE: 複合の主キーを作成&lt;br&gt;CREATE TABLE: DEFAULT 制約を作成&lt;br&gt;CREATE TABLE: DEFAULT 制約を名前をつけて作成&lt;br&gt;CREATE TABLE: CHECK 制約を作成&lt;br&gt;CREATE TABLE: CHECK 制約を名前をつけて作成&lt;br&gt;CREATE TABLE: 外部キーを作成&lt;br&gt;CREATE TABLE: 外部キーに名前をつけて作成&lt;br&gt;ALTER TABLE: カラムを追加&lt;br&gt;ALTER TABLE: カラムを追加すると同時に DEFAULT 制約の追加&lt;br&gt;ALTER TABLE: カラムを追加すると同時に CHECK 制約の追加&lt;br&gt;ALTER TABLE: カラムを追加すると同時に外部キーを追加&lt;br&gt;ALTER TABLE: カラムを NULL から NOT NULL に変更&lt;br&gt;ALTER TABLE: カラムのデータ型を変更&lt;br&gt;ALTER TABLE: DEFAULT 制約を追加&lt;br&gt;ALTER TABLE: CHECK 制約を追加&lt;br&gt;ALTER TABLE: 外部キーを追加&lt;br&gt;ALTER TABLE: カラムの削除&lt;br&gt;ALTER TABLE: 制約（外部キー・DEFAULT・CHECK）を名前を指定して削除</description><pubDate>Sat, 09 Aug 2025 07:25:00 GMT</pubDate><category>便利なT-SQL＆クエリー集</category></item>
<item><title>SQL Server のデータ型の優先順位と注意点</title><link>https://sql55.com/column/sql-server-data-type-precedence.php</link><description>SQL Server のデータ型の優先順位と注意点&lt;br&gt;&lt;br&gt;SQL Server hosting&lt;br&gt;SQL Server のデータ型の優先順位と注意点について&lt;br&gt;SQL Server のデータ型には「優先順位」というものがあります。&lt;br&gt;&lt;br&gt;そして、それを知っていないとエラーになってしまうような場面もたまにあります。&lt;br&gt;&lt;br&gt;この記事では、SQL Server のデータ型の優先順位と注意点などをご紹介します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;SQL Server のデータ型の優先順位&lt;br&gt;データ型の優先順位に関連する注意点</description><pubDate>Wed, 06 Aug 2025 06:30:00 GMT</pubDate><category>SQL Server＆T-SQLに関するコラム</category></item>
<item><title>T-SQL - TRANSLATE 関数の使い方と REPLACE 関数との違い</title><link>https://sql55.com/t-sql/t-sql-translate.php</link><description>よく使われる SQL Server のビルトインのファンクション&lt;br&gt;T-SQL - TRANSLATE 関数の使い方と REPLACE 関数との違い&lt;br&gt;&lt;br&gt;TRANSLATE 関数の基本とREPLACE 関数との違い&lt;br&gt;SQL Server を使って開発をしていると、文字を置き換えたい時がたまにあるかと思います。&lt;br&gt;&lt;br&gt;T-SQL で文字を置き換えると聞いてまず思いつくのが REPLACE 関数かもしれませんが、TRANSLATE 関数を使っても文字を置き換えることができます。&lt;br&gt;&lt;br&gt;ですが、REPLACE 関数と TRANSLATE 関数では少し動きが違います。&lt;br&gt;&lt;br&gt;この記事では、SQL Server の TRANSLATE 関数の基本的な使い方とREPLACE 関数との違いなどをご紹介します。&lt;br&gt;&lt;br&gt;目次SQL Server hosting&lt;br&gt;TRANSLATE 関数の基本的な使い方&lt;br&gt;TRANSLATE 関数と REPLACE 関数の違い&lt;br&gt;</description><pubDate>Tue, 05 Aug 2025 06:49:00 GMT</pubDate><category>T-SQL 入門</category></item>
<item><title>T-SQL - COALESCE 関数の使い方と注意点</title><link>https://sql55.com/t-sql/t-sql-coalesce.php</link><description>T-SQL - COALESCE 関数の使い方と注意点&lt;br&gt;&lt;br&gt;COALESCE 関数の使い方と注意点&lt;br&gt;この記事では、SQL Server の COALESCE 関数の基本的な使い方と注意点をご紹介します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;COALESCE 関数の基本的な使い方&lt;br&gt;COALESCE 関数の注意点&lt;br&gt;COALESCE 関数の基本的な使い方&lt;br&gt;SQL Server の COALESCE 関数は、渡した引数の中で、最初に NULL ではない値を返す関数です。&lt;br&gt;</description><pubDate>Fri, 01 Aug 2025 06:49:00 GMT</pubDate><category>T-SQL 入門</category></item>
<item><title>Visual Studio Code の MSSQL エクステンションを使って SQL Server に接続する方法</title><link>https://sql55.com/sql-server/visual-studio-code-sql-server-mssql-extension.php</link><description>Visual Studio Code の MSSQL エクステンションを使って SQL Server に接続する方法&lt;br&gt;&lt;br&gt;通常、SQL Server に接続・開発するのに SQL Server Management Studio (SSMS) を使うと思います。&lt;br&gt;&lt;br&gt;ですが、SQL Server Management Studio (SSMS) は Windows 以外の環境用のものは用意されていません。&lt;br&gt;&lt;br&gt;&lt;br&gt;macOS や Linux などから SQL Server に接続する際には Azure Data Studio というクラスプラットフォームのプログラムがありますが、Azure Data Studio は、マイクロ ソフトから 2025 年 2 月に廃止が発表され、2026 年 2 月 28 日にサポートが終了する予定です。&lt;br&gt;&lt;br&gt;Azure Data Studio の代わりに、Visual Studio Code の MSSQL エクステンションを使うように推奨されいます。&lt;br&gt;&lt;br&gt;&lt;br&gt;この記事では、Mac の VS Code (Visual Studio Code) に SQL Server (mssql) エクステンションをインストールし、SQL Server に接続する方法をご紹介します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;VS Code に SQL Server (mssql) エクステンションをインストールする&lt;br&gt;SQL Server (mssql) エクステンションから SQL Server に接続する&lt;br&gt;VS Code に SQL Server (mssql) エクステンションをインストールする&lt;br&gt;まずは、VS Code に SQL Server (mssql) エクステンションをインストールする方法をご説明します。&lt;br&gt;&lt;br&gt;VS Code はインストールされている前提ですすめますが、もしインストールされていない方は「Download Visual Studio Code」検索して、ダウンロードしてインストールしておいてください。&lt;br&gt;&lt;br&gt;&lt;br&gt;メニューから [Code] &gt; [Settings] &gt; [Extensions] を開きます。&lt;br&gt;&lt;br&gt;VS Code の MSSQL エクステンションを使って SQL Server に接続する方法 1&lt;br&gt;&lt;br&gt;&lt;br&gt;サイドバーのエクステンションアイコンをクリックしても大丈夫です。&lt;br&gt;&lt;br&gt;VS Code の MSSQL エクステンションを使って SQL Server に接続する方法 1-2&lt;br&gt;&lt;br&gt;&lt;br&gt;上の検索ボックスに「SQL Server (mssql)」と入れて検索し、SQL Server (mssql) エクステンションを選択し、[Install] ボタンをクリックします。&lt;br&gt;&lt;br&gt;VS Code の MSSQL エクステンションを使って SQL Server に接続する方法 2&lt;br&gt;&lt;br&gt;&lt;br&gt;これで、SQL Server (mssql) エクステンションが VS Code にインストールされました。&lt;br&gt;&lt;br&gt;VS Code の MSSQL エクステンションを使って SQL Server に接続する方法 3&lt;br&gt;&lt;br&gt;&lt;br&gt;SQL Server (mssql) エクステンションから SQL Server に接続する&lt;br&gt;それでは、Mac の VS Code の SQL Server (mssql) エクステンションを使って、Windows にインストールされている SQL Server に接続してみます。&lt;br&gt;&lt;br&gt;まず、Windows の SQL Server 側がリモート接続できる状態になっていないといけません。&lt;br&gt;&lt;br&gt;設定の方法は以下のページをご覧ください。&lt;br&gt;&lt;br&gt;SQL Server デフォルトインスタンスへのリモート接続の設定方法&lt;br&gt;SQL Server 名前付きインスタンスへのリモート接続の設定方法&lt;br&gt;&lt;br&gt;VS Code で新しい画面を開き、サイドバーの SQL Server アイコンをクリックします。&lt;br&gt;&lt;br&gt;VS Code の MSSQL エクステンションを使って SQL Server に接続する方法 4&lt;br&gt;&lt;br&gt;&lt;br&gt;SQL Server のパネルが開くので、CONNECTIONS の + Add Connection をクリックします。&lt;br&gt;&lt;br&gt;VS Code の MSSQL エクステンションを使って SQL Server に接続する方法 5&lt;br&gt;&lt;br&gt;&lt;br&gt;Connection Dialog の画面が開きます。&lt;br&gt;&lt;br&gt;VS Code の MSSQL エクステンションを使って SQL Server に接続する方法 6&lt;br&gt;&lt;br&gt;&lt;br&gt;接続する SQL Server の情報を入力して、[Connect] ボタンをクリックします。&lt;br&gt;&lt;br&gt;VS Code の MSSQL エクステンションを使って SQL Server に接続する方法 7&lt;br&gt;&lt;br&gt;Profile Name には任意の名前を入力します。&lt;br&gt;Input type は、今回は Azure のデータベースに接続しないので、Paramters にしておきます。&lt;br&gt;Server name には IP アドレスを入力します。&lt;br&gt;Authentication type は SQL Login を選択します。&lt;br&gt;User name にはログインユーザー名を入力します。&lt;br&gt;Password にパスワードを入力します。&lt;br&gt;Encrypt は Optional にしておきます。&lt;br&gt;* Database name は指定すると、接続後にそのデータベースだけが見えるようになります。&lt;br&gt;&lt;br&gt;&lt;br&gt;接続が成功すると左側のパネルの CONNECTIONS のところに Profile Name の名前でデータベースサーバの情報が表示されます。&lt;br&gt;&lt;br&gt;VS Code の MSSQL エクステンションを使って SQL Server に接続する方法 8&lt;br&gt;&lt;br&gt;&lt;br&gt;試しに、Test データベースの Student テーブルで右クリックして [Select Top 1000] を選択してみます。&lt;br&gt;&lt;br&gt;VS Code の MSSQL エクステンションを使って SQL Server に接続する方法 9&lt;br&gt;&lt;br&gt;&lt;br&gt;右側の画面に次のようなクエリーが表示されて実行され、結果セットが下に表示されました。&lt;br&gt;&lt;br&gt;SELECT TOP (1000) [StudentID]&lt;br&gt;      ,[FirstName]&lt;br&gt;      ,[LastName]&lt;br&gt;      ,[Birthday]&lt;br&gt;      ,[Gender]&lt;br&gt;  FROM [Test].[dbo].[Student]&lt;br&gt;VS Code の MSSQL エクステンションを使って SQL Server に接続する方法 10&lt;br&gt;&lt;br&gt;SQL Server に接続でき、データが取得できることが確認できました。&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、VS Code に SQL Server (mssql) エクステンションをインストールし、SQL Server に接続する方法をご紹介しました。</description><pubDate>Tue, 29 Jul 2025 02:09:00 GMT</pubDate><category>Microsoft SQL Server 入門</category></item>
<item><title>T-SQL - CHOOSE 関数の使い方：インデックスで値を取得する方法</title><link>https://sql55.com/t-sql/t-sql-choose.php</link><description>T-SQL - CHOOSE 関数の使い方：インデックスで値を取得する方法&lt;br&gt;&lt;br&gt;CHOOSE 関数の使い方：インデックスで値を取得する方法&lt;br&gt;今回は、配列からインデックスを指定して値を取得するような動きをする、CHOOSE 関数についてご紹介します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;CHOOSE 関数の基本的な使い方と注意点&lt;br&gt;CHOOSE 関数について思うこと&lt;br&gt;</description><pubDate>Sun, 27 Jul 2025 03:20:00 GMT</pubDate><category>T-SQL 入門</category></item>
<item><title>T-SQL: 日付から日本語の曜日「月・火・水・木・金・土・日」を取得する方法</title><link>https://sql55.com/query/t-sql-get-day-of-the-week-in-japanese.php</link><description>T-SQL: 日付から日本語の曜日「月・火・水・木・金・土・日」を取得する方法&lt;br&gt;&lt;br&gt;日付から日本語の曜日「月・火・水・木・金・土・日」を取得する&lt;br&gt;SQL Server を使って、日本のクライアントのシステム開発していると、日付から日本語の曜日を取得したい時があります。&lt;br&gt;&lt;br&gt;今回はそんな時に使える、日付から日本語の曜日「月・火・水・木・金・土・日」を取得する方法を何個かご紹介します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;FORMAT 関数を使って日本語の曜日を取得する&lt;br&gt;DATENAME 関数を使って日本語の曜日を取得する&lt;br&gt;DATEPART 関数を使って日本語の曜日を取得する&lt;br&gt;FORMAT 関数を使って日本語の曜日を取得する&lt;br&gt;</description><pubDate>Sat, 26 Jul 2025 04:27:00 GMT</pubDate><category>便利なT-SQL＆クエリー集</category></item>
<item><title>DATE_BUCKET 関数の使い方と活用例：時系列データを簡単にグルーピングする方法</title><link>https://sql55.com/query/t-sql-date-bucket.php</link><description>DATE_BUCKET 関数の使い方と活用例：時系列データを簡単にグルーピングする方法&lt;br&gt;&lt;br&gt;DATE_BUCKET 関数の使い方と活用例&lt;br&gt;T-SQL を使ってデータ分析をしていて、時系列のデータを一定の間隔でグルーピングして集計したいような時、ありませんか？&lt;br&gt;&lt;br&gt;例えば、月ごと、日ごとなどにグルーピングして集計したいような時などです。&lt;br&gt;&lt;br&gt;そんなときに便利なのが SQL Server 2022 から追加された DATE_BUCKET 関数です。&lt;br&gt;&lt;br&gt;DATE_BUCKET 関数を使えば、これまで他の日付用の関数を組み合わせて書いていたような「日付の丸め処理」が簡単に行えるようになります。&lt;br&gt;&lt;br&gt;この記事では、DATE_BUCKET 関数の基本的な使い方や活用例などをご紹介します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;DATE_BUCKET 関数の基本と使い方&lt;br&gt;DATE_BUCKET 関数の活用例&lt;br&gt;DATE_BUCKET 関数の基本と使い方&lt;br&gt;SQL Server の DATE_BUCKET 関数は、時系列データを指定した一定の間隔でバケット化（グループ化）し、そのバケットの開始日時を返してくれる関数です。&lt;br&gt;&lt;br&gt;SQL Server 2022 以降で追加された関数です。&lt;br&gt;&lt;br&gt;&lt;br&gt;DATE_BUCKET 関数の基本構文は以下の通りです。&lt;br&gt;&lt;br&gt;DATE_BUCKET (datepart, number, date [, origin ] )&lt;br&gt;&lt;br&gt;datepart: date をグループ化する単位を指定します。&lt;br&gt;&lt;br&gt;指定できる単位には次のようなものがあります。Abbreviations で指定しても大丈夫です。&lt;br&gt;&lt;br&gt;&lt;br&gt;datepart	Abbreviations&lt;br&gt;day	dd, d&lt;br&gt;week	wk, ww&lt;br&gt;month	mm, m&lt;br&gt;quarter	qq, q&lt;br&gt;year	yy, yyyy&lt;br&gt;hour	hh&lt;br&gt;minute	mi, n&lt;br&gt;second	ss, s&lt;br&gt;millisecond	ms&lt;br&gt;&lt;br&gt;number: バケットの幅を正の整数で指定します。origin からの幅になります。&lt;br&gt;&lt;br&gt;date: グループ化（バケット化）の対象となる日時を指定します。引数は日付系のデータ型でなければなりません。&lt;br&gt;&lt;br&gt;origin: オプショナルの引数でバケットの幅を数え始める開始の日時を指定できます。 指定しなかった場合のデフォルト値は 1900-01-01 00:00:00.000 になります。&lt;br&gt;&lt;br&gt;&lt;br&gt;戻り値は指定した date より前の、もっとも近いバケットの開始日時を返します。&lt;br&gt;&lt;br&gt;戻り値のデータ型は入力引数の date と同じデータ型になります。&lt;br&gt;&lt;br&gt;DATE_BUCKET 関数は、SELECT、WHERE、GROUP BY、HAVING、ORDER BY 句などで使うことができます。&lt;br&gt;&lt;br&gt;&lt;br&gt;それでは、DATE_BUCKET 関数を使って、バケットの開始日を取得してみます。&lt;br&gt;&lt;br&gt;次のような、ユーザーのログイン・ログアウトの履歴を保存してある EventLog テーブルがあります。&lt;br&gt;&lt;br&gt;SELECT  EventLogID,&lt;br&gt;        UserID,&lt;br&gt;        EventTime,&lt;br&gt;        EventType&lt;br&gt;FROM    EventLog&lt;br&gt;ORDER BY EventTime;&lt;br&gt;[実行結果]&lt;br&gt;DATE_BUCKET 関数の使い方 1&lt;br&gt;&lt;br&gt;&lt;br&gt;この EventLog テーブルから、例えば UserID = 1 の EventTime に対して、DATE_BUCKET 関数を使って、バケットの開始日を取得するには、次のようにできます。&lt;br&gt;&lt;br&gt;SELECT  *,&lt;br&gt;        DATE_BUCKET(hh, 1, EventTime) AS BucketStart_EveryHour,&lt;br&gt;        DATE_BUCKET(hh, 2, EventTime) AS BucketStart_Every2Hours,&lt;br&gt;        DATE_BUCKET(dd, 1, EventTime) AS BucketStart_EveryDay,&lt;br&gt;        DATE_BUCKET(mm, 1, EventTime) AS BucketStart_EveryMonth&lt;br&gt;FROM    EventLog&lt;br&gt;WHERE   UserID = 1;&lt;br&gt;[実行結果]&lt;br&gt;DATE_BUCKET 関数の使い方 2&lt;br&gt;&lt;br&gt;datepart に指定している hh は時間、dd は 日、mm は月です。&lt;br&gt;&lt;br&gt;DATE_BUCKET 関数を使い、それぞれ、EventTime に対して、毎時間、2時間ごと、毎日、毎月のグルーピングでバケット化して、バケットの開始日時を取得しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;毎日（1日ごと）という指定でバケット化している、EventTime と BucketStart_EveryDay に注目してみます。&lt;br&gt;&lt;br&gt;&lt;br&gt;最初の 5 行は EventTime の日付が 2025-07-01 なので、時間に関係なく、BucketStart_EveryDay は 2025-07-01 になっています。&lt;br&gt;&lt;br&gt;続く 3 行は EventTime の日付が 2025-07-02 なので、時間に関係なく、BucketStart_EveryDay は 2025-07-02 になっています。&lt;br&gt;&lt;br&gt;このように指定した引数でバケット化（グループ化）した、バケットの開始の日時を取得できます。&lt;br&gt;&lt;br&gt;&lt;br&gt;DATE_BUCKET 関数の活用例&lt;br&gt;DATE_BUCKET 関数を使うと、指定した期間に起こったイベントの数などを簡単に集計することができます。&lt;br&gt;&lt;br&gt;例えば、先ほどの EventLog テーブルから、日ごとでイベントを起こった数を取得したい時は次のようにできます。&lt;br&gt;&lt;br&gt;SELECT  DATE_BUCKET(dd, 1, EventTime) AS EventDate,&lt;br&gt;        COUNT(*) AS EventCount&lt;br&gt;FROM    EventLog&lt;br&gt;GROUP BY DATE_BUCKET(dd, 1, EventTime)&lt;br&gt;ORDER BY EventDate;&lt;br&gt;[実行結果]&lt;br&gt;DATE_BUCKET 関数の使い方 3&lt;br&gt;&lt;br&gt;&lt;br&gt;また、ユーザーごと、日付ごとにイベント数を計算したい場合は次のようにできます。&lt;br&gt;&lt;br&gt;SELECT  UserID,&lt;br&gt;        DATE_BUCKET(dd, 1, EventTime) AS EventDate,&lt;br&gt;        COUNT(*) AS EventCount&lt;br&gt;FROM    EventLog&lt;br&gt;GROUP BY UserID,&lt;br&gt;         DATE_BUCKET(dd, 1, EventTime)&lt;br&gt;ORDER BY UserID,&lt;br&gt;         EventDate;&lt;br&gt;[実行結果]&lt;br&gt;DATE_BUCKET 関数の使い方 4&lt;br&gt;&lt;br&gt;&lt;br&gt;バケットの開始日時だけでなく、終了日時も取得したい時は DATEADD 関数で、バケットの幅を開始日時に足すことによって取得できます。&lt;br&gt;&lt;br&gt;SELECT  DATE_BUCKET(hh, 4, EventTime) AS EventHourFrom,&lt;br&gt;        DATEADD(hh, 4, DATE_BUCKET(hh, 4, EventTime)) AS EventHourTo_Exclusive,&lt;br&gt;        COUNT(*) AS EventCount&lt;br&gt;FROM    EventLog&lt;br&gt;GROUP BY DATE_BUCKET(hh, 4, EventTime)&lt;br&gt;ORDER BY EventHourFrom;&lt;br&gt;[実行結果]&lt;br&gt;DATE_BUCKET 関数の使い方 5&lt;br&gt;&lt;br&gt;EventHourTo_Exclusive（バケットの終了日時）は、その行のバケット内には含まれませんのでご注意ください。&lt;br&gt;&lt;br&gt;また、この方法で集計した時に得られる行は、レコードが存在しているバケットのみなので、バケットの日時は連続していないという点にもご注意ください。&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、DATE_BUCKET 関数の基本的な使い方や活用例などをご紹介しました。</description><pubDate>Fri, 25 Jul 2025 00:39:00 GMT</pubDate><category>便利なT-SQL＆クエリー集</category></item>
<item><title>GETDATE 関数と SYSDATETIME 関数の違い：T-SQL で現在日時を取得する方法</title><link>https://sql55.com/column/t-sql-difference-between-getdate-and-sysdatetime.php</link><description>GETDATE 関数と SYSDATETIME 関数の違い：T-SQL で現在日時を取得する方法&lt;br&gt;&lt;br&gt;GETDATE 関数と SYSDATETIME 関数の違いについて&lt;br&gt;SQL Server を使って開発をしていると、「現在の日時」を取得する機会がたくさんあります。&lt;br&gt;&lt;br&gt;T-SQL で現在の日時を取得したい時、GETDATE 関数やSYSDATETIME 関数がよく使われます。&lt;br&gt;&lt;br&gt;この記事では、GETDATE 関数と SYSDATETIME 関数の基本的な使い方と、この二つの関数の違い、使い分けのポイントなどをご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;GETDATE 関数の使い方と特徴&lt;br&gt;SYSDATETIME 関数の使い方と特徴&lt;br&gt;GETDATE 関数 と SYSDATETIME 関数の違い&lt;br&gt;GETDATE 関数の使い方と特徴&lt;br&gt;T-SQL で現在の日時を取得したい時に一番よく使われるのが GETDATE 関数だと思います。&lt;br&gt;&lt;br&gt;GETDATE 関数は、タイムゾーンオフセットなしの、データベースシステムのタイムスタンプを返します。&lt;br&gt;&lt;br&gt;通常 SQL Server のインスタンスが実行されている、OS の現在時刻と同じになります。&lt;br&gt;&lt;br&gt;使い方はシンプルで、引数なしで次のようにして現在日時を取得できます。&lt;br&gt;&lt;br&gt;SELECT GETDATE();&lt;br&gt;[実行結果]&lt;br&gt;GETDATE 関数と SYSDATETIME 関数の違い 1&lt;br&gt;&lt;br&gt;GETDATE 関数の戻り値のデータ型は DATETIME になります。&lt;br&gt;&lt;br&gt;&lt;br&gt;以下のように複数行を返す SELECT 文の SELECT 句で GETDATE 関数&lt;br&gt;&lt;br&gt;を使うと、一度だけしか評価されないので、戻り値は全部同じになります。&lt;br&gt;SELECT GETDATE()&lt;br&gt;FROM   sys.objects;&lt;br&gt;[実行結果]&lt;br&gt;GETDATE 関数と SYSDATETIME 関数の違い 2&lt;br&gt;&lt;br&gt;&lt;br&gt;SYSDATETIME 関数の使い方と特徴&lt;br&gt;T-SQL で現在の日時を取得したい時に候補に上がるのが SYSDATETIME 関数かと思います。&lt;br&gt;&lt;br&gt;SYSDATETIME 関数も、タイムゾーンオフセットなしの、データベースシステムのタイムスタンプを返します。&lt;br&gt;&lt;br&gt;通常 SQL Server のインスタンスが実行されている、OS の現在時刻と同じになります。&lt;br&gt;&lt;br&gt;使い方もGETDATE 関数と同様で、引数なしで次のようにして現在日時を取得できます。&lt;br&gt;&lt;br&gt;SELECT SYSDATETIME();&lt;br&gt;[実行結果]&lt;br&gt;GETDATE 関数と SYSDATETIME 関数の違い 3&lt;br&gt;&lt;br&gt;SYSDATETIME 関数の戻り値のデータ型は datetime2(7) になります。&lt;br&gt;&lt;br&gt;&lt;br&gt;先ほどのように、複数行を返す SELECT 文の SELECT 句で SYSDATETIME 関数&lt;br&gt;&lt;br&gt;を使うと、こちらも全行同じ日時が返ってきます。&lt;br&gt;SELECT SYSDATETIME()&lt;br&gt;FROM   sys.objects;&lt;br&gt;[実行結果]&lt;br&gt;GETDATE 関数と SYSDATETIME 関数の違い 4&lt;br&gt;&lt;br&gt;&lt;br&gt;GETDATE 関数 と SYSDATETIME 関数の違い&lt;br&gt;GETDATE 関数と SYSDATETIME 関数の違い 0&lt;br&gt;&lt;br&gt;GETDATE 関数と SYSDATETIME 関数の大きな違いは、戻り値の精度です。&lt;br&gt;&lt;br&gt;GETDATE 関数は DATETIME 型の値を返し、 SYSDATETIME 関数は、DATETIME2(7) 型の値を返します。&lt;br&gt;&lt;br&gt;DATETIME2 の後の (7) は秒の小数点以下に何桁まで保持するかを示していて、ここでは 7 桁となっています。&lt;br&gt;&lt;br&gt;&lt;br&gt;DATETIME 型と DATETIME2 型のデータ型は次のように違います。&lt;br&gt;&lt;br&gt;DATETIME 型&lt;br&gt;フォーマット: yyyy-MM-dd HH:mm:ss.nnn&lt;br&gt;範囲: 1753-01-01 から 9999-12-31&lt;br&gt;精度: 0.00333 秒&lt;br&gt;例: 2025-07-23 23:55:12.837&lt;br&gt;&lt;br&gt;DATETIME2 型&lt;br&gt;フォーマット: yyyy-MM-dd HH:mm:ss.nnnnnnn&lt;br&gt;範囲: 0001-01-01 00:00:00.0000000 から 9999-12-31 23:59:59.9999999&lt;br&gt;精度: 100 ナノ秒&lt;br&gt;例: 2025-07-23 23:55:12.8382443&lt;br&gt;&lt;br&gt;&lt;br&gt;日付の範囲に関しては、現在の日付をとるので、DATETIME 型で 1753 年よりも前の年に対応していなくても、今回のケースでは問題がないと思います。&lt;br&gt;&lt;br&gt;気にしないとけいないのは精度が違うところです。&lt;br&gt;&lt;br&gt;DATETIME 型の精度は 0.00333 秒なので、現在の時間は 300 分の 1 秒ごとの刻み（0.00333秒）で丸められます。&lt;br&gt;&lt;br&gt;&lt;br&gt;次のような日時を表す文字列を DATETIME 型にキャストすると、戻り値は以下のようになります。&lt;br&gt;&lt;br&gt;SELECT  CAST(&#039;2025-07-23 19:34:56.000&#039; AS DATETIME) AS D0, --&gt; 2025-07-23 19:34:56.000&lt;br&gt;        CAST(&#039;2025-07-23 19:34:56.001&#039; AS DATETIME) AS D1, --&gt; 2025-07-23 19:34:56.000&lt;br&gt;        CAST(&#039;2025-07-23 19:34:56.002&#039; AS DATETIME) AS D2, --&gt; 2025-07-23 19:34:56.003&lt;br&gt;        CAST(&#039;2025-07-23 19:34:56.003&#039; AS DATETIME) AS D3, --&gt; 2025-07-23 19:34:56.003&lt;br&gt;        CAST(&#039;2025-07-23 19:34:56.004&#039; AS DATETIME) AS D4, --&gt; 2025-07-23 19:34:56.003&lt;br&gt;        CAST(&#039;2025-07-23 19:34:56.005&#039; AS DATETIME) AS D5, --&gt; 2025-07-23 19:34:56.007&lt;br&gt;        CAST(&#039;2025-07-23 19:34:56.006&#039; AS DATETIME) AS D6, --&gt; 2025-07-23 19:34:56.007&lt;br&gt;        CAST(&#039;2025-07-23 19:34:56.007&#039; AS DATETIME) AS D7, --&gt; 2025-07-23 19:34:56.007&lt;br&gt;        CAST(&#039;2025-07-23 19:34:56.008&#039; AS DATETIME) AS D8, --&gt; 2025-07-23 19:34:56.007&lt;br&gt;        CAST(&#039;2025-07-23 19:34:56.009&#039; AS DATETIME) AS D9; --&gt; 2025-07-23 19:34:56.010&lt;br&gt;[実行結果]&lt;br&gt;GETDATE 関数と SYSDATETIME 関数の違い 5&lt;br&gt;&lt;br&gt;&lt;br&gt;同じ日時を表す文字列を DATETIME2 型にキャストすると、戻り値は以下のようになります。&lt;br&gt;&lt;br&gt;SELECT  CAST(&#039;2025-07-23 19:34:56.000&#039; AS DATETIME2) AS D0, --&gt; 2025-07-23 19:34:56.0000000&lt;br&gt;        CAST(&#039;2025-07-23 19:34:56.001&#039; AS DATETIME2) AS D1, --&gt; 2025-07-23 19:34:56.0010000&lt;br&gt;        CAST(&#039;2025-07-23 19:34:56.002&#039; AS DATETIME2) AS D2, --&gt; 2025-07-23 19:34:56.0020000&lt;br&gt;        CAST(&#039;2025-07-23 19:34:56.003&#039; AS DATETIME2) AS D3, --&gt; 2025-07-23 19:34:56.0030000&lt;br&gt;        CAST(&#039;2025-07-23 19:34:56.004&#039; AS DATETIME2) AS D4, --&gt; 2025-07-23 19:34:56.0040000&lt;br&gt;        CAST(&#039;2025-07-23 19:34:56.005&#039; AS DATETIME2) AS D5, --&gt; 2025-07-23 19:34:56.0050000&lt;br&gt;        CAST(&#039;2025-07-23 19:34:56.006&#039; AS DATETIME2) AS D6, --&gt; 2025-07-23 19:34:56.0060000&lt;br&gt;        CAST(&#039;2025-07-23 19:34:56.007&#039; AS DATETIME2) AS D7, --&gt; 2025-07-23 19:34:56.0070000&lt;br&gt;        CAST(&#039;2025-07-23 19:34:56.008&#039; AS DATETIME2) AS D8, --&gt; 2025-07-23 19:34:56.0080000&lt;br&gt;        CAST(&#039;2025-07-23 19:34:56.009&#039; AS DATETIME2) AS D9; --&gt; 2025-07-23 19:34:56.0090000&lt;br&gt;[実行結果]&lt;br&gt;GETDATE 関数と SYSDATETIME 関数の違い 6&lt;br&gt;&lt;br&gt;DATETIME 型にキャストしたほうは、300 分の 1 秒ごとの刻みに丸められていて、DATETIME2 型にキャストしたほうは、日時を表す文字列がそのまま情報を失わず変換されていることがわかります。&lt;br&gt;&lt;br&gt;&lt;br&gt;ですので、欲しい現在日時が、秒単位までで良いのような時は GETDATE 関数で十分だと思います。&lt;br&gt;&lt;br&gt;現在日時を取得する際に、精度が重要な用途の時には SYSDATETIME 関数を使うとよいと思います。&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、GETDATE 関数と SYSDATETIME 関数の基本的な使い方と、この二つの関数の違い、使い分けのポイントなどをご説明しました。</description><pubDate>Thu, 24 Jul 2025 02:49:00 GMT</pubDate><category>SQL Server＆T-SQLに関するコラム</category></item>
<item><title>SQL Server - 全テーブルのレコード数を一覧で取得する方法</title><link>https://sql55.com/query/sql-server-get-all-tables-with-row-count.php</link><description>SQL Server - 全テーブルのレコード数を一覧で取得する方法&lt;br&gt;&lt;br&gt;SQL Server で全テーブルのレコード数を一覧で取得する方法&lt;br&gt;SQL Server で分析をしている時に、データベース内の全てのテーブル名と、それぞれのレコード数の一覧を取得したいと思ったことはありませんか？&lt;br&gt;&lt;br&gt;この記事では、SQL Server で全テーブルのレコード数の一覧を効率的に取得する方法をご紹介します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;sys.dm_db_partition_stats を使う方法&lt;br&gt;各テーブルに対して COUNT(*) を実行する方法&lt;br&gt;sys.dm_db_partition_stats を使う方法&lt;br&gt;</description><pubDate>Tue, 22 Jul 2025 03:00:00 GMT</pubDate><category>便利なT-SQL＆クエリー集</category></item>
<item><title>【T-SQL入門】GREATEST 関数の使い方と注意点：複数の値から最大値を取得する方法</title><link>https://sql55.com/t-sql/t-sql-greatest.php</link><description>【T-SQL入門】GREATEST 関数の使い方と注意点：複数の値から最大値を取得する方法&lt;br&gt;&lt;br&gt;GREATEST 関数の使い方と注意点：複数の値から最大値を取得する方法&lt;br&gt;SQL Server で開発をしていると、複数の変数やカラムに入っている値の中から、最も大きい値を取得したい場面があります。&lt;br&gt;&lt;br&gt;そんな時に便利なのが、GREATEST 関数です。&lt;br&gt;&lt;br&gt;GREATEST 関数は、SQL Server 2022 から使えるようになった、比較的新しい T-SQL の関数です。&lt;br&gt;&lt;br&gt;この記事では、SQL Server における GREATEST 関数の基本的な使い方と注意点などをご紹介します。&lt;br&gt;&lt;br&gt;※ 最小値を取得したい場合は、こちらの記事をご覧ください：LEAST 関数の使い方と注意点&lt;br&gt;&lt;br&gt;目次&lt;br&gt;GREATEST 関数の基本構文と使い方&lt;br&gt;GREATEST 関数の NULL の扱いについて&lt;br&gt;GREATEST 関数の戻り値のデータ型について&lt;br&gt;SQL Server 2022 未満の代替方法&lt;br&gt;</description><pubDate>Mon, 21 Jul 2025 04:27:00 GMT</pubDate><category>T-SQL入門</category></item>
<item><title>【T-SQL入門】LEAST 関数の使い方と注意点：複数の値から最小値を取得する方法</title><link>https://sql55.com/t-sql/t-sql-least.php</link><description>【T-SQL入門】LEAST 関数の使い方と注意点：複数の値から最小値を取得する方法&lt;br&gt;&lt;br&gt;LEAST 関数の使い方と注意点：複数の値から最小値を取得する方法&lt;br&gt;T-SQL でプログラミングをしていると、複数の変数やカラムなどに入っている値を比較して、最も小さい値を取得したい時があります。&lt;br&gt;&lt;br&gt;そんな時に便利なのが、LEAST 関数です。&lt;br&gt;&lt;br&gt;SQL Server では 2022 以降で使えるようになった関数です。&lt;br&gt;&lt;br&gt;この記事では、SQL Server における LEAST 関数の基本的な使い方と注意点などをご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;LEAST 関数の基本的な使い方&lt;br&gt;LEAST 関数の NULL の扱いについて&lt;br&gt;LEAST 関数の戻り値のデータ型について&lt;br&gt;SQL Server 2022 未満の代替方法&lt;br&gt;</description><pubDate>Sun, 20 Jul 2025 06:01:00 GMT</pubDate><category>T-SQL入門</category></item>
<item><title>【T-SQL入門】IIF 関数の使い方と注意点：シンプルに条件分岐する方法</title><link>https://sql55.com/t-sql/t-sql-iif.php</link><description>【T-SQL入門】IIF 関数の使い方と注意点：シンプルに条件分岐する方法&lt;br&gt;&lt;br&gt;IIF 関数の使い方と注意点：シンプルに条件分岐する方法&lt;br&gt;T-SQL でプログラミングをしていると、ちょっとだけ条件分岐を書きたい時があります。&lt;br&gt;&lt;br&gt;C# でしたら [条件文] ? [true の時] : [false の時] とインラインで書きたいような場面です。&lt;br&gt;&lt;br&gt;T-SQL でそんな時に便利なのが、IIF 関数です。&lt;br&gt;&lt;br&gt;この記事では、IIF 関数の基本的な使い方から、CASE 式との違い、実務で役立つ活用例などをご紹介します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;IIF 関数の基本的な使い方&lt;br&gt;IIF 関数の条件式の NULL の扱いについて&lt;br&gt;IIF 関数と CASE 関数の違いとネストする際の注意点&lt;br&gt;IIF 関数の基本的な使い方&lt;br&gt;SQL Server の IIF 関数は、シンプルな条件分岐のための関数です。&lt;br&gt;&lt;br&gt;SQL Server 2012 以降で使用可能です。&lt;br&gt;&lt;br&gt;IF 文とは違って、SELECT 文の中で使うことができます。&lt;br&gt;&lt;br&gt;&lt;br&gt;IIF 関数の基本的な構文は以下の通りです。&lt;br&gt;&lt;br&gt;IIF ( [条件式], [TRUE の値], [FALSE の値] )&lt;br&gt;IIF 関数の使い方 0&lt;br&gt;&lt;br&gt;[条件式] には、TRUE か FALSE になる、評価される条件式を指定します。TRUE・FALSE を返さない式を指定するとエラーになります。&lt;br&gt;&lt;br&gt;[TRUE の値] には、[条件式] が TRUE の時に返す値を指定します。&lt;br&gt;&lt;br&gt;[FALSE の値] には、[条件式] が TRUE ではない時に返す値を指定します。「FALSE の時は」でないことに注意してください。これについては後述します。&lt;br&gt;&lt;br&gt;&lt;br&gt;それでは、IIF 関数を使ってシンプルな条件分岐をしてみます。&lt;br&gt;&lt;br&gt;次のような、StoreName（店舗名）、SalesDate（売上日）、SalesAmount（売上金額）が保存されている、Sales（売上）テーブルがあります。&lt;br&gt;&lt;br&gt;SELECT  StoreName,&lt;br&gt;        SalesDate,&lt;br&gt;        SalesAmount&lt;br&gt;FROM    Sales;&lt;br&gt;[実行結果]&lt;br&gt;IIF 関数の使い方 1&lt;br&gt;&lt;br&gt;&lt;br&gt;これに、IIF 関数を使って SalesAmount が 1000 以上の時は、&#039;Achieved&#039;（目標達成）、そうでない時は &#039;NotAchieved&#039; （目標達成ならず）という SalesGoalStatus というカラムを追加してみます。&lt;br&gt;&lt;br&gt;SELECT  StoreName,&lt;br&gt;        SalesDate,&lt;br&gt;        SalesAmount,&lt;br&gt;        IIF(SalesAmount &gt;= 1000, &#039;Achieved&#039;, &#039;NotAchieved&#039;) AS SalesGoalStatus&lt;br&gt;FROM    Sales;&lt;br&gt;[実行結果]&lt;br&gt;IIF 関数の使い方 2&lt;br&gt;&lt;br&gt;IIF 関数の条件式に、SalesAmount &gt;= 1000 を指定し、TRUE の時は &#039;Achieved&#039;、それ以外の場合は &#039;NotAchieved&#039; を返すようにしています。&lt;br&gt;&lt;br&gt;SalesGoalStatus には、SalesAmount が 1000 未満の 4 行目と 5 行目に &#039;NotAchieved&#039;、それ以外には &#039;Achieved&#039; が返っています。&lt;br&gt;&lt;br&gt;&lt;br&gt;IIF 関数の条件式の NULL の扱いについて&lt;br&gt;先ほど、基本構文の説明で、[FALSE の値] には、[条件式] が TRUE ではない時に返す値を指定しますと書きました。&lt;br&gt;&lt;br&gt;条件文が FALSE の時に [FALSE の値] を返すわけではないことに注意してください。&lt;br&gt;&lt;br&gt;これは、IIF 関数の条件式を評価した結果が UNKNOWN（NULL） だった場合も [FALSE の値] を返すためです。&lt;br&gt;&lt;br&gt;&lt;br&gt;実際に確認してみましょう。&lt;br&gt;&lt;br&gt;SELECT IIF(1 = NULL, &#039;aaa&#039;, &#039;bbb&#039;);&lt;br&gt;[実行結果]&lt;br&gt;IIF 関数の使い方 3&lt;br&gt;&lt;br&gt;上の例では、条件式 1 = NULL は評価すると UNKNOWN になります。&lt;br&gt;&lt;br&gt;ですので IIF 関数は &#039;bbb&#039; を返しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;IIF 関数と CASE 関数の違いとネストする際の注意点&lt;br&gt;IIF 関数は、CASE 式を簡単に記述するためのもので、実際には CASE 式に変換されます。&lt;br&gt;&lt;br&gt;ですので、IIF 関数は CASE 式と同じ動きをしたり、同じ制限があります。&lt;br&gt;&lt;br&gt;&lt;br&gt;例えば、先ほどのこのクエリーは、下の CASE 式と同等です。&lt;br&gt;&lt;br&gt;SELECT  StoreName,&lt;br&gt;        SalesDate,&lt;br&gt;        SalesAmount,&lt;br&gt;        IIF(SalesAmount &gt;= 1000, &#039;Achieved&#039;, &#039;NotAchieved&#039;) AS SalesGoalStatus&lt;br&gt;FROM    Sales;&lt;br&gt;SELECT  StoreName,&lt;br&gt;        SalesDate,&lt;br&gt;        SalesAmount,&lt;br&gt;        CASE&lt;br&gt;          WHEN SalesAmount &gt;= 1000&lt;br&gt;            THEN &#039;Achieved&#039;&lt;br&gt;            ELSE &#039;NotAchieved&#039;&lt;br&gt;        END AS SalesGoalStatus&lt;br&gt;FROM    Sales;&lt;br&gt;[実行結果]&lt;br&gt;IIF 関数の使い方 4&lt;br&gt;&lt;br&gt;&lt;br&gt;また、IIF 関数は次のような感じでネストできますが、CASE 式と同様に最大 10 回までしかネストできません。&lt;br&gt;&lt;br&gt;SELECT  StoreName,&lt;br&gt;        SalesDate,&lt;br&gt;        SalesAmount,&lt;br&gt;        IIF(SalesAmount &gt;= 1000, IIF(SalesAmount &gt;= 1200, &#039;Achieved (Excellent)&#039;, &#039;Achieved&#039;), &#039;NotAchieved&#039;) AS SalesGoalStatus&lt;br&gt;FROM    Sales;&lt;br&gt;[実行結果]&lt;br&gt;IIF 関数の使い方 5&lt;br&gt;&lt;br&gt;条件文が複雑になる場合は、IIF 関数で書くと読みにくくなってしまうので、そういう時は CASE 式を使い、シンプルな時のみ IIF 関数を使うことをおすすめします。&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、IIF 関数の基本的な使い方から、CASE 式との違い、実務で役立つ活用例などをご紹介しました。&lt;br&gt;</description><pubDate>Sat, 19 Jul 2025 07:35:00 GMT</pubDate><category>T-SQL 入門</category></item>
<item><title>【T-SQL入門】LEAD 関数の使い方と活用例：次の行の値を取得する方法</title><link>https://sql55.com/t-sql/t-sql-lead.php</link><description>【T-SQL入門】LEAD 関数の使い方と活用例：次の行の値を取得する方法&lt;br&gt;&lt;br&gt;LEAD 関数の使い方と活用例：次の行の値を取得する方法&lt;br&gt;T-SQL を使ってデータ分析をしていて、現在の行の値と次の行の値を比較したくなることありませんか？&lt;br&gt;&lt;br&gt;例えば、売上が次の日に増えたかどうかや、ステータスが変わる次の値を確認したい時です。&lt;br&gt;&lt;br&gt;そんなときに便利なのが LEAD 関数です。&lt;br&gt;&lt;br&gt;この記事では、LEAD 関数の基本的な使い方から、実務で役立つ例などをご紹介します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;LEAD 関数の基本的な使い方&lt;br&gt;PARTITION BY でグルーピングする&lt;br&gt;LEAD 関数のデフォルト値を指定する&lt;br&gt;LEAD 関数の基本的な使い方&lt;br&gt;SQL Server の LEAD 関数は、現在の行から「指定した行数分だけ次の値」を取得するウィンドウ関数です。&lt;br&gt;&lt;br&gt;SQL Server 2012 以降で使用可能です。&lt;br&gt;&lt;br&gt;&lt;br&gt;LEAD 関数の基本構文は以下の通りです。&lt;br&gt;&lt;br&gt;LEAD (列名 [, オフセット] [, デフォルト値])&lt;br&gt;OVER ( [PARTITION BY グループ] ORDER BY 並び順 )&lt;br&gt;LEAD 関数の使い方 0&lt;br&gt;&lt;br&gt;[列名] には、LEAD 関数でどの列のデータを取得するかを指定します。&lt;br&gt;&lt;br&gt;[オフセット] はオプショナルの引数で、何行次のデータを取得するかを正の整数で指定します。&lt;br&gt;&lt;br&gt;[オフセット] を指定しなかった場合のデフォルトは 1 で、1 行後の&lt;br&gt;&lt;br&gt;&lt;br&gt;[デフォルト値] もオプショナルの引数で、オフセットの指定がスコープの外になってしまった時に返す、デフォルトの値や式などを指定することができます。&lt;br&gt;&lt;br&gt;[デフォルト値] は列名と同じに変換できるデータ型のものでなければなりません。&lt;br&gt;&lt;br&gt;[デフォルト値] 指定しなければ NULL になります。&lt;br&gt;&lt;br&gt;&lt;br&gt;OVER ( [PARTITION BY グループ] ORDER BY 並び順 ) の部分は、「ORDER BY 並び順」は必須で、どの順番で並べて、何行後の値をとるかを指定します。&lt;br&gt;&lt;br&gt;[PARTITION BY グループ] の部分はオプショナルで、FROM 句によって生成された結果セットを、LEAD 関数が適用されるパーティションに分割することができます。&lt;br&gt;&lt;br&gt;&lt;br&gt;[PARTITION BY グループ] を指定しなかった場合は、結果セット全部がひとつのグループとして扱われます。&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;それでは、LEAD 関数を使って、次の行の値を取得してみましょう。&lt;br&gt;&lt;br&gt;次のような、StoreName（店舗名）、SalesDate（売上日）、SalesAmount（売上金額）が保存されている、Sales（売上）テーブルがあります。&lt;br&gt;&lt;br&gt;SELECT  StoreName,&lt;br&gt;        SalesDate,&lt;br&gt;        SalesAmount&lt;br&gt;FROM    Sales;&lt;br&gt;[実行結果]&lt;br&gt;&lt;br&gt;LEAD 関数の使い方 1&lt;br&gt;&lt;br&gt;&lt;br&gt;この Sales テーブルから、LEAD 関数を使って Store A の「次回の売上金額」を取得するには、次のようにできます。&lt;br&gt;&lt;br&gt;SELECT  StoreName,&lt;br&gt;        SalesDate,&lt;br&gt;        SalesAmount,&lt;br&gt;        LEAD(SalesAmount) OVER (ORDER BY SalesDate) AS NextSales&lt;br&gt;FROM    Sales&lt;br&gt;WHERE   StoreName = &#039;Store A&#039;&lt;br&gt;ORDER BY SalesDate;&lt;br&gt;[実行結果]&lt;br&gt;&lt;br&gt;LEAD 関数の使い方 2&lt;br&gt;&lt;br&gt;SalesDate で並べて、1 行うしろの行の SalesAmount が NextSales に表示されています。&lt;br&gt;&lt;br&gt;デフォルト値を指定しておらず、最後の行には「次の行」が存在しないため、NextSales が NULL になっています。&lt;br&gt;&lt;br&gt;&lt;br&gt;PARTITION BY でグルーピングする&lt;br&gt;先ほどのクエリーから、WHERE StoreName = &#039;Store A&#039; をとり、全ての店舗を対象とすると、次のような結果セットが返ってきます。&lt;br&gt;&lt;br&gt;SELECT  StoreName,&lt;br&gt;        SalesDate,&lt;br&gt;        SalesAmount,&lt;br&gt;        LEAD(SalesAmount) OVER (ORDER BY SalesDate) AS NextSales&lt;br&gt;FROM    Sales&lt;br&gt;ORDER BY SalesDate;&lt;br&gt;[実行結果]&lt;br&gt;&lt;br&gt;LEAD 関数の使い方 3&lt;br&gt;&lt;br&gt;LEAD 関数で次の行の SalesAmount は取得できていますが、Store A と Store B がまざって、あまり意味のない数字になってしまっています。&lt;br&gt;&lt;br&gt;&lt;br&gt;こんな時に便利なのが PARTITION BY です。&lt;br&gt;&lt;br&gt;PARTITION BY で StoreName を指定して店舗ごとにグルーピングし、その中で SalesDate 順に並べられ、次の行の SalesAmount を取得することができます。&lt;br&gt;&lt;br&gt;SELECT StoreName,&lt;br&gt;        SalesDate,&lt;br&gt;        SalesAmount,&lt;br&gt;        LEAD(SalesAmount) OVER (PARTITION BY StoreName ORDER BY SalesDate) AS NextSales&lt;br&gt;FROM    Sales&lt;br&gt;ORDER BY StoreName,&lt;br&gt;         SalesDate;&lt;br&gt;[実行結果]&lt;br&gt;&lt;br&gt;LEAD 関数の PARTITION BY 使用例&lt;br&gt;&lt;br&gt;店舗ごとにグルーピングされて、SalesDate 順で次の行の SalesAmount が取得されているのがわかります。&lt;br&gt;&lt;br&gt;3 行目と 6 行目はグループの最後の行で、次の行がないので、NextSales が NULL になっています。&lt;br&gt;&lt;br&gt;&lt;br&gt;LEAD 関数のデフォルト値を指定する&lt;br&gt;先ほどの例のように、各グループの最後の行で次の行が存在しない場合、LEAD 関数はデフォルトで NULL を返します。&lt;br&gt;&lt;br&gt;NULL の代わりの値を指定したい場合、第 3 引数でデフォルト値を指定できます。&lt;br&gt;&lt;br&gt;&lt;br&gt;例えば、先ほどのクエリーで、デフォルト値を現在の行の SalesAmount に設定するには、次のようにできます。&lt;br&gt;&lt;br&gt;SELECT StoreName,&lt;br&gt;        SalesDate,&lt;br&gt;        SalesAmount,&lt;br&gt;        LEAD(SalesAmount, 1, SalesAmount) OVER (PARTITION BY StoreName ORDER BY SalesDate) AS NextSales&lt;br&gt;FROM    Sales&lt;br&gt;ORDER BY StoreName,&lt;br&gt;         SalesDate;&lt;br&gt;[実行結果]&lt;br&gt;&lt;br&gt;LEAD 関数の使い方 5&lt;br&gt;&lt;br&gt;第 3 引数のデフォルト値を指定するには、第 2 引数のオフセットも指定する必要があります。&lt;br&gt;&lt;br&gt;LEAD(SalesAmount, 1, SalesAmount) のように、オフセットは 1 を指定して、1 行次の値を取得するようにし、デフォルト値には SalesAmount を指定しています。&lt;br&gt;&lt;br&gt;実行結果を見ると、グループの最後の行である、3 行目と 6 行目の NextSales には、現在の行の SalesAmount が入っています。&lt;br&gt;&lt;br&gt;&lt;br&gt;また、次のようにして LEAD 関数を使って、売上の増減を取得することができます。&lt;br&gt;&lt;br&gt;SELECT  StoreName,&lt;br&gt;        SalesDate,&lt;br&gt;        SalesAmount,&lt;br&gt;        LEAD(SalesAmount, 1, SalesAmount) OVER (PARTITION BY StoreName ORDER BY SalesDate) AS NextSales,&lt;br&gt;        ISNULL(LEAD(SalesAmount, 1, SalesAmount) OVER (PARTITION BY StoreName ORDER BY SalesDate), 0) &lt;br&gt;        - ISNULL(SalesAmount, 0) AS SalesDifference&lt;br&gt;FROM    Sales&lt;br&gt;ORDER BY StoreName,&lt;br&gt;         SalesDate;&lt;br&gt;[実行結果]&lt;br&gt;&lt;br&gt;LEAD 関数の使い方 6&lt;br&gt;&lt;br&gt;SalesDifference を計算する際は、SalesAmount も NextSales も NULL の時は 0 として計算したいので、ISNULL 関数を使って、NULL を 0 として扱い、計算可能にしています。&lt;br&gt;&lt;br&gt;LEAD 関数 を使って、NextSales - SalesAmount = SalesDifference として、売上の増減値が取得できていますね。&lt;br&gt;&lt;br&gt;デフォルト値を現在の行の SalesAmount にすることによって、グループの最後の行は、SalesDifference が 0 になるようにしています。&lt;br&gt;&lt;br&gt;ここから、売上増減の比率を計算したり、売上の予測や傾向をみたり、データ分析に役立てることができます。&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、LEAD 関数の基本的な使い方から、実務で役立つ例などをご紹介しました。&lt;br&gt;&lt;br&gt;&lt;br&gt;補足：LAG 関数との違い&lt;br&gt;&lt;br&gt;関数	参照する行&lt;br&gt;LAG	現在の行の前の行&lt;br&gt;LEAD	現在の行の次の行&lt;br&gt;LAG 関数については こちらの記事 をご覧ください。&lt;br&gt;&lt;br&gt;</description><pubDate>Fri, 18 Jul 2025 04:10:00 GMT</pubDate><category>T-SQL 入門</category></item>
<item><title>【T-SQL入門】LAG 関数の使い方：前の行の値を取得する方法</title><link>https://sql55.com/t-sql/t-sql-lag.php</link><description>【T-SQL入門】LAG 関数の使い方：前の行の値を取得する方法&lt;br&gt;&lt;br&gt;LAG 関数の使い方：前の行の値を取得する方法&lt;br&gt;T-SQL でプログラミングをしていると、SELECT 文の中で、前の行の値と現在の行の値との差分をとりたいような時ありませんか？&lt;br&gt;&lt;br&gt;以前はそんな時、同じテーブルや結果セットをずらして JOIN するなど、工夫しなければなりませんでした。&lt;br&gt;&lt;br&gt;今は LAG 関数を使えば、前の行の値を参照することができます。&lt;br&gt;&lt;br&gt;この記事では、LAG 関数の基本的な使い方から、実務で役立つ例などをご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;LAG 関数の基本的な使い方&lt;br&gt;PARTITION BY でグルーピングする&lt;br&gt;LAG 関数のデフォルト値を指定する&lt;br&gt;LAG 関数の基本的な使い方&lt;br&gt;SQL Server の LAG 関数は、現在の行から「指定した行数分だけ前の値」を参照するウィンドウ関数です。&lt;br&gt;&lt;br&gt;SQL Server 2012 以降で使用可能です。&lt;br&gt;&lt;br&gt;&lt;br&gt;LAG 関数の基本的な構文は以下の通りです。&lt;br&gt;&lt;br&gt;LAG (列名 [, オフセット] [, デフォルト値])&lt;br&gt;OVER ( [PARTITION BY グループ] ORDER BY 並び順 )&lt;br&gt;LAG 関数の使い方 0&lt;br&gt;&lt;br&gt;[列名] には、LAG 関数でどの列のデータを取得するかを指定します。&lt;br&gt;&lt;br&gt;[オフセット] はオプショナルの引数で、何行前のデータを取得するかで、指定しなかった場合のデフォルトは 1 です。&lt;br&gt;&lt;br&gt;[デフォルト値] もオプショナルの引数で、オフセットの指定がスコープの外になってしまった時に返す値や式などを指定することができます。指定しなければ NULL が返ります。&lt;br&gt;&lt;br&gt;[デフォルト値] は列名と同じに変換できるデータ型のものでなければなりません。&lt;br&gt;&lt;br&gt;OVER ( [PARTITION BY グループ] ORDER BY 並び順 ) の部分は、ORDER BY 並び順 は必須で、どの順番で並べて、何行前の値をとるかを指定します。&lt;br&gt;&lt;br&gt;[PARTITION BY グループ] の部分はオプショナルで、FROM 句によって生成された結果セットを、LAG 関数が適用されるパーティションに分割することができます。&lt;br&gt;&lt;br&gt;&lt;br&gt;[PARTITION BY グループ] を指定しなかった場合は、結果セット全部がひとつのグループとしてあつかわれます。&lt;br&gt;&lt;br&gt;&lt;br&gt;それでは、LAG 関数を使って、前の行の値を取得してみましょう。&lt;br&gt;&lt;br&gt;次のような、StoreName（店舗名）、SalesDate（売上日）、SalesAmount（売上金額）が保存されている、Sales（売上）テーブルがあります。&lt;br&gt;&lt;br&gt;SELECT  StoreName,&lt;br&gt;        SalesDate,&lt;br&gt;        SalesAmount&lt;br&gt;FROM    Sales;&lt;br&gt;[実行結果]&lt;br&gt;&lt;br&gt;LAG 関数の使い方 1&lt;br&gt;&lt;br&gt;&lt;br&gt;この Sales テーブルから、LAG 関数を使って Store A の前回の売上金額を取得するには、次のようにできます。&lt;br&gt;&lt;br&gt;SELECT  StoreName,&lt;br&gt;        SalesDate,&lt;br&gt;        SalesAmount,&lt;br&gt;        LAG(SalesAmount) OVER (ORDER BY SalesDate) AS PreviousSales&lt;br&gt;FROM    Sales&lt;br&gt;WHERE   StoreName = &#039;Store A&#039;&lt;br&gt;ORDER BY SalesDate;&lt;br&gt;[実行結果]&lt;br&gt;&lt;br&gt;LAG 関数の使い方 2&lt;br&gt;&lt;br&gt;SalesDate で並べて、1 行前の SalesAmount が PreviousSales に表示されています。&lt;br&gt;&lt;br&gt;1 行目は、デフォルト値を指定しておらず、前の行がスコープ外になるので、NULL が返っています。&lt;br&gt;&lt;br&gt;&lt;br&gt;PARTITION BY でグルーピングする&lt;br&gt;先ほどのクエリーから、WHERE StoreName = &#039;Store A&#039; をとると、次のような結果セットが返ってきます。&lt;br&gt;&lt;br&gt;SELECT  StoreName,&lt;br&gt;        SalesDate,&lt;br&gt;        SalesAmount,&lt;br&gt;        LAG(SalesAmount) OVER (ORDER BY SalesDate) AS PreviousSales&lt;br&gt;FROM    Sales&lt;br&gt;ORDER BY SalesDate;&lt;br&gt;[実行結果]&lt;br&gt;&lt;br&gt;LAG 関数の使い方 3&lt;br&gt;&lt;br&gt;LAG 関数で前の行の SalesAmount は取得できていますが、Store A と Store B がまざって、あまり意味のない数字になってしまっています。&lt;br&gt;&lt;br&gt;&lt;br&gt;こんな時に便利なのが PARTITION BY です。&lt;br&gt;&lt;br&gt;PARTITION BY で StoreName を指定することによって、店舗ごとにグルーピングされ、その中で SalesDate 順に並べられ、前の行の SalesAmount を取得することができます。&lt;br&gt;&lt;br&gt;SELECT StoreName,&lt;br&gt;        SalesDate,&lt;br&gt;        SalesAmount,&lt;br&gt;        LAG(SalesAmount) OVER (PARTITION BY StoreName ORDER BY SalesDate) AS PreviousSales&lt;br&gt;FROM    Sales&lt;br&gt;ORDER BY StoreName,&lt;br&gt;         SalesDate;&lt;br&gt;[実行結果]&lt;br&gt;&lt;br&gt;LAG 関数の使い方 4&lt;br&gt;&lt;br&gt;店舗ごとにグルーピングされて、SalesDate 順で前の行の SalesAmount が取得されているのがわかります。&lt;br&gt;&lt;br&gt;1 行目と 4 行目はグループの 1 行目で、前の行がないので、PreviousSales が NULL になっています。&lt;br&gt;&lt;br&gt;&lt;br&gt;LAG 関数のデフォルト値を指定する&lt;br&gt;先ほどの結果セットのように LAG 関数は各グループの 1 行目は、前の行がないので NULL を返します。&lt;br&gt;&lt;br&gt;第 3 引数にデフォルト値を設定することによって、NULL の代わりにその値を取得できます。&lt;br&gt;&lt;br&gt;&lt;br&gt;例えば、先ほどのクエリーで、デフォルト値を 0 に設定するには、次のようにできます。&lt;br&gt;&lt;br&gt;SELECT StoreName,&lt;br&gt;        SalesDate,&lt;br&gt;        SalesAmount,&lt;br&gt;        LAG(SalesAmount, 1, 0) OVER (PARTITION BY StoreName ORDER BY SalesDate) AS PreviousSales&lt;br&gt;FROM    Sales&lt;br&gt;ORDER BY StoreName,&lt;br&gt;         SalesDate;&lt;br&gt;[実行結果]&lt;br&gt;&lt;br&gt;LAG 関数の使い方 5&lt;br&gt;&lt;br&gt;第 3 引数のデフォルト値を指定するには、第 2 引数のオフセットも指定する必要があります。&lt;br&gt;&lt;br&gt;LAG(SalesAmount, 1, 0) のように、オフセットは 1 を指定して、1 行前の値を取得するようにし、デフォルト値には 0 を指定しています。&lt;br&gt;&lt;br&gt;実行結果を見ると、グループの 1 行目である、1 行目と 4 行目の PreviousSales が 0 になっていますね。&lt;br&gt;&lt;br&gt;&lt;br&gt;また、次のようにして LAG 関数を使って、売上の増減を取得することができます。&lt;br&gt;&lt;br&gt;SELECT  StoreName,&lt;br&gt;        SalesDate,&lt;br&gt;        SalesAmount,&lt;br&gt;        LAG(SalesAmount, 1, 0) OVER (PARTITION BY StoreName ORDER BY SalesDate) AS PreviousSales,&lt;br&gt;        ISNULL(SalesAmount, 0) &lt;br&gt;        - ISNULL(LAG(SalesAmount) OVER (PARTITION BY StoreName ORDER BY SalesDate), 0) AS SalesDifference&lt;br&gt;FROM    Sales&lt;br&gt;ORDER BY StoreName,&lt;br&gt;         SalesDate;&lt;br&gt;[実行結果]&lt;br&gt;&lt;br&gt;LAG 関数の使い方 6&lt;br&gt;&lt;br&gt;SalesDifference を計算する際は、SalesAmount も PreviousSales も NULL の時は 0 として計算したいので、デフォルト値は指定せず、ISNULL 関数を使って、NULL を 0 として扱い、計算可能にしています。&lt;br&gt;&lt;br&gt;SalesDifference として、売上の増減値が取得できていますね。&lt;br&gt;&lt;br&gt;ここから、売上増減の比率を計算したり、売上が減った月だけを取得したり、データ分析に役立てることができます。&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、LAG 関数の基本的な使い方から、実務で役立つ例などをご説明しました。</description><pubDate>Thu, 17 Jul 2025 02:45:00 GMT</pubDate><category>T-SQL 入門</category></item>
<item><title>【T-SQL入門】CONCAT_WS 関数の使い方と注意点：区切り文字を入れて文字列を結合する方法</title><link>https://sql55.com/t-sql/t-sql-concat-ws.php</link><description>【T-SQL入門】CONCAT_WS 関数の使い方と注意点：区切り文字を入れて文字列を結合する方法&lt;br&gt;&lt;br&gt;CONCAT_WS 関数の使い方と注意点：区切り文字を入れて文字列を結合する方法&lt;br&gt;T-SQL で複数の文字列を結合するとき、文字と文字の間に区切り文字（セパレーター）を入れて結合したいことがあります。&lt;br&gt;&lt;br&gt;そんなときに便利なのが、CONCAT_WS 関数です。&lt;br&gt;&lt;br&gt;この記事では、CONCAT_WS 関数の基本的な使い方から、実務で役立つ例、注意点などをご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;CONCAT_WS 関数の基本的な使い方&lt;br&gt;CONCAT_WS 関数の NULL の扱いについて&lt;br&gt;CONCAT_WS 関数の実務で役立つ使い方&lt;br&gt;CONCAT_WS 関数の基本的な使い方&lt;br&gt;SQL Server の CONCAT_WS 関数は、区切り文字を入れて、複数の文字列を 1 つに結合するための T-SQL 関数です。&lt;br&gt;&lt;br&gt;CONCAT の後ろについている WS というのは &quot;With Separator&quot; の略です。&lt;br&gt;&lt;br&gt;SQL Server 2017 以降で使用可能です。&lt;br&gt;</description><pubDate>Wed, 16 Jul 2025 00:26:00 GMT</pubDate><category>T-SQL 入門</category></item>
<item><title>【T-SQL入門】CONCAT 関数の使い方と注意点：文字列を結合する方法</title><link>https://sql55.com/t-sql/t-sql-concat.php</link><description>【T-SQL入門】CONCAT 関数の使い方と注意点：文字列を結合する方法&lt;br&gt;&lt;br&gt;CONCAT 関数の使い方と注意点：文字列を結合する方法&lt;br&gt;SQL Server で複数の文字列をつなげたいときに便利なのが CONCAT 関数です。&lt;br&gt;&lt;br&gt;+ 演算子と似ていますが、CONCAT 関数を使うと、より安全に文字列を結合することができます。&lt;br&gt;&lt;br&gt;この記事では、CONCAT 関数の基本的な使い方から、実務で役立つ例、注意点などをご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;CONCAT 関数の基本的な使い方&lt;br&gt;CONCAT 関数の実務で役立つ使い方&lt;br&gt;CONCAT 関数の基本的な使い方&lt;br&gt;SQL Server の CONCAT 関数は、複数の文字列を 1 つに結合するための T-SQL 関数です。&lt;br&gt;&lt;br&gt;SQL Server 2012 以降で使用可能です。&lt;br&gt;</description><pubDate>Tue, 15 Jul 2025 00:34:00 GMT</pubDate><category>T-SQL 入門</category></item>
<item><title>【T-SQL入門】ABS 関数の使い方と注意点：絶対値を取得する方法</title><link>https://sql55.com/t-sql/t-sql-abs.php</link><description>【T-SQL入門】ABS 関数の使い方と注意点：絶対値を取得する方法&lt;br&gt;&lt;br&gt;ABS 関数の使い方と注意点：絶対値を取得する方法&lt;br&gt;T-SQL を使って数値を処理する際、値のプラスマイナスに関わらず、プラスの値として処理をしたい、という場面がたまにあります。&lt;br&gt;&lt;br&gt;そんなときに便利なのが、絶対値を返してくれる ABS 関数です。&lt;br&gt;&lt;br&gt;この記事では、ABS 関数の基本的な使い方や、実務で役立つ応用例、注意点などをご紹介します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;ABS 関数の基本的な使い方&lt;br&gt;ABS 関数の実務で役立つ使い方&lt;br&gt;ABS 関数を使う際の注意点&lt;br&gt;ABS 関数の基本的な使い方&lt;br&gt;SQL Server の ABS 関数は、Absolute（絶対値） の略で、数値の絶対値（符号を除いた値）を返します。&lt;br&gt;</description><pubDate>Mon, 14 Jul 2025 03:29:00 GMT</pubDate><category>T-SQL 入門</category></item>
<item><title>【T-SQL入門】RAND 関数の使い方と注意点：乱数を生成する方法</title><link>https://sql55.com/t-sql/t-sql-rand.php</link><description>【T-SQL入門】RAND 関数の使い方と注意点：乱数を生成する方法&lt;br&gt;RAND 関数の使い方と注意点：乱数を生成する方法&lt;br&gt;プログラムでランダムな数字を生成したい時があるかもしれません。&lt;br&gt;&lt;br&gt;SQL Server の RAND 関数を使うと、0 以上 1 未満の浮動小数点の乱数を簡単に生成することができます。&lt;br&gt;&lt;br&gt;この記事では、RAND 関数の使い方や注意点などをご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;RAND 関数とは？（概要と戻り値）&lt;br&gt;RAND 関数の基本的な使い方&lt;br&gt;任意の範囲で乱数を生成する方法&lt;br&gt;行ごとに異なる乱数を生成する方法&lt;br&gt;RAND 関数とは？（概要と戻り値）&lt;br&gt;SQL Server の RAND 関数は、擬似乱数（疑似的なランダムな値）を生成する関数です。&lt;br&gt;&lt;br&gt;戻り値は常に 0 以上 1 未満 の float 型の値になります。&lt;br&gt;&lt;br&gt;構文は以下の通りで、オプショナルな入力引数にシードを受け取ります。&lt;br&gt;&lt;br&gt;RAND ( [シード] )&lt;br&gt;&lt;br&gt;RAND 関数の基本的な使い方&lt;br&gt;まず、シンプルにRAND 関数を使って値を取得してみます。&lt;br&gt;&lt;br&gt;SELECT RAND();&lt;br&gt;このクエリを実行するたびに、0以上1未満の異なる乱数が返されます。ただし、同一クエリ内では同じ値になることがあるため注意が必要です（後述）。&lt;br&gt;&lt;br&gt;[実行結果] 1 回目&lt;br&gt;&lt;br&gt;RAND 関数の使い方：乱数を生成する方法 1&lt;br&gt;&lt;br&gt;[実行結果] 2 回目&lt;br&gt;&lt;br&gt;RAND 関数の使い方：乱数を生成する方法 2&lt;br&gt;&lt;br&gt;&lt;br&gt;シード値には、任意の整数を指定でき、シード値を渡すと、毎回同じ乱数が生成されます。&lt;br&gt;&lt;br&gt;テストや再現性のある処理を行いたいときに便利です。&lt;br&gt;&lt;br&gt;SELECT RAND(567);&lt;br&gt;[実行結果] 1 回目&lt;br&gt;&lt;br&gt;RAND 関数の使い方：乱数を生成する方法 3&lt;br&gt;&lt;br&gt;[実行結果] 2 回目&lt;br&gt;&lt;br&gt;RAND 関数の使い方：乱数を生成する方法 4&lt;br&gt;&lt;br&gt;1 回目の実行、2 回目の実行で、同じ値が返ってきていますね。&lt;br&gt;&lt;br&gt;&lt;br&gt;任意の範囲で乱数を生成する方法&lt;br&gt;0 以上 1 未満ではなく、ある範囲内の乱数を生成したい時があるかもしれません。&lt;br&gt;&lt;br&gt;例えば、RAND 関数を使って、1 から 100 の整数乱数を作りたい場合は、次のようにできます。&lt;br&gt;&lt;br&gt;SELECT FLOOR(RAND() * 100) + 1;&lt;br&gt;&lt;br&gt;まず、RAND 関数で 0 以上 1 未満の数値を取得して、それに 100 をかけることで、 0 ~ 100 未満の数値にしています。&lt;br&gt;&lt;br&gt;小数点以下を取り除くために FLOOR 関数で切り捨て、さらに 1 を足すことで 1〜100 の範囲になります。&lt;br&gt;&lt;br&gt;&lt;br&gt;[実行結果] 1 回目&lt;br&gt;&lt;br&gt;RAND 関数の使い方：乱数を生成する方法 5&lt;br&gt;&lt;br&gt;[実行結果] 2 回目&lt;br&gt;&lt;br&gt;RAND 関数の使い方：乱数を生成する方法 6&lt;br&gt;&lt;br&gt;1 回目実行時は 18、2 回目実行時は 68 と、1 ~ 100 の整数乱数が取得できています。&lt;br&gt;&lt;br&gt;&lt;br&gt;行ごとに異なる乱数を生成する方法&lt;br&gt;RAND 関数を使う際に、気をつけないといけないのは、RAND 関数は、1つのテーブルに対する SELECT 文などでは、1 ステートメント内で 1 回しか評価されず、すべての行に同じ乱数が適用されるという挙動になる点です。&lt;br&gt;&lt;br&gt;&lt;br&gt;例えば、次のように RAND 関数を使って各行に異なる乱数を生成しようと思っても、同じ値が返ってきてしまいます。&lt;br&gt;&lt;br&gt;SELECT name, &lt;br&gt;       RAND() AS RandValue&lt;br&gt;FROM   sys.objects;&lt;br&gt;[実行結果]&lt;br&gt;&lt;br&gt;RAND 関数の使い方：乱数を生成する方法 7&lt;br&gt;&lt;br&gt;&lt;br&gt;RAND 関数 を使って、行ごとに異なる乱数を生成したい場合には、次のようにできます。&lt;br&gt;&lt;br&gt;SELECT name, &lt;br&gt;       RAND(CHECKSUM(NEWID())) AS RandValue&lt;br&gt;FROM   sys.objects;&lt;br&gt;まず、NEWID 関数を使って、行ごとに異なる GUID を生成しています。&lt;br&gt;&lt;br&gt;CHECKSUM 関数 は「ハッシュ的な数値を簡単に得る」ための軽量な関数です。&lt;br&gt;&lt;br&gt;生成した GUID を CHECKSUM 関数に渡して整数化しています。&lt;br&gt;&lt;br&gt;CHECKSUM 関数の戻り値を、RAND 関数のシードに使うことによって、各行に異なる乱数が生成されるようにしています。&lt;br&gt;&lt;br&gt;&lt;br&gt;[実行結果]&lt;br&gt;&lt;br&gt;RAND 関数の使い方：乱数を生成する方法 8&lt;br&gt;&lt;br&gt;実行してみると、各行に違う乱数が返ってきているのがわかります。&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、RAND 関数の基本的な使い方と、実務で役立つ注意点をご紹介しました。&lt;br&gt;&lt;br&gt;T-SQL でテストデータを作ったり、処理の一部をランダム化したいときにぜひ活用してみてください。</description><pubDate>Sat, 12 Jul 2025 23:26:00 GMT</pubDate><category>T-SQL 入門</category></item>
<item><title>【T-SQL入門】文字列のパターン検索に便利なPATINDEX の使い方</title><link>https://sql55.com/t-sql/t-sql-patindex.php</link><description>知っておくと便利な関数 - PATINDEX の使い方&lt;br&gt;ここでは、文字列のパターン検索に便利なビルトイン関数のひとつ、PATINDEX 関数についてご説明します。&lt;br&gt;&lt;br&gt;&lt;br&gt;PATINDEX 関数&lt;br&gt;PATINDEX 関数は、指定したパターンが検索対象の文字列の中の何文字目から始まるかを返してくれる関数で、構文は次の通りです。&lt;br&gt;&lt;br&gt;PATINDEX (&#039;%パターン%&#039;, 検索対象の文字列)&lt;br&gt;&lt;br&gt;PATINDEX に指定するパターンは、ワイルドカード（%, _, [], [^]）など含むパターンである必要があります。&lt;br&gt;&lt;br&gt;%: 0 文字以上の任意の文字列&lt;br&gt;_: 任意の 1 文字&lt;br&gt;[]: 指定された任意の 1 文字&lt;br&gt;[^]: 指定以外の任意の 1 文字&lt;br&gt;&lt;br&gt;戻り値は、パターンが最初に現れる位置で、位置のカウントは一番最初の文字を 1 としてカウントします。&lt;br&gt;&lt;br&gt;パターンが、対象文字列の中に複数回現れる場合は、最初の出現の位置を返します。&lt;br&gt;&lt;br&gt;指定した文字が出現しない場合は 0 を返します。</description><pubDate>Sun, 06 Jul 2025 03:49:00 GMT</pubDate><category>T-SQL 入門</category></item>
<item><title>T-SQL で文字列内の各文字の UNICODE を調べる方法</title><link>https://sql55.com/query/t-sql-how-to-check-each-character-unicode.php</link><description>T-SQL で文字列内の各文字の UNICODE を調べる方法&lt;br&gt;T-SQL で文字列内の各文字の UNICODE を調べる&lt;br&gt;入力ミスや文字化けなどで、文字列に目で見て判断できない文字が入り込んでしまって、それが何か特定したいような時があります。&lt;br&gt;&lt;br&gt;ここでは、T-SQL で文字列内の各文字の UNICODE を調べて、その文字が何かを特定する方法をご紹介します。</description><pubDate>Sat, 05 Jul 2025 04:05:00 GMT</pubDate><category>便利なT-SQL＆クエリー集</category></item>
<item><title>T-SQL - LEN() 関数は末尾の空白をカウントしない</title><link>https://sql55.com/column/t-sql-len-excludes-trailing-blanks.php</link><description>T-SQL - LEN() 関数は末尾の空白をカウントしない&lt;br&gt;開発をしていると、文字列の末尾の数文字を削除したいような時がたまにありますよね。&lt;br&gt;&lt;br&gt;LEFT() 関数や SUBSTRING() 関数と、 LEN() 関数を使って、以下のように削除する方法が思いつくかもしれません。&lt;br&gt;&lt;br&gt;&lt;br&gt;例えば、アルファベットが並んだ文字列から最後の 2 文字を削除するのであれば、次のような感じです。&lt;br&gt;&lt;br&gt;DECLARE @Value VARCHAR(200)  = &#039;ABCDEFGHIJKLMNOPQRSTUVWXYZ&#039;;&lt;br&gt;&lt;br&gt;SELECT LEFT(@Value, LEN(@Value) - 2),&lt;br&gt;       SUBSTRING(@Value, 1, LEN(@Value) - 2);&lt;br&gt;T-SQL - LEN() 関数は末尾の空白をカウントしない 1&lt;br&gt;&lt;br&gt;&lt;br&gt;この LEN() 関数で文字数を取得して - 2 した長さの文字数を取り出しているのですが、ここで注意が必要です。&lt;br&gt;&lt;br&gt;LEN() 関数は末尾の空白をカウントしません。&lt;br&gt;&lt;br&gt;末尾に空白を含む文字列に LEN() で文字数を取得すると、次のような結果になります。&lt;br&gt;&lt;br&gt;SELECT LEN(&#039;ABC    &#039;),&lt;br&gt;       LEN(&#039;                        &#039;);&lt;br&gt;T-SQL - LEN() 関数は末尾の空白をカウントしない 2&lt;br&gt;&lt;br&gt;&lt;br&gt;ですので、以下のような状況で同じ方法をつかって末尾の 2 文字を削除しようとしても、期待した結果が得られません。&lt;br&gt;&lt;br&gt;DECLARE @Value VARCHAR(200) = &#039;Amazon, Rakuten, Yahoo Shopping, &#039;;&lt;br&gt;&lt;br&gt;SELECT LEFT(@Value, LEN(@Value) - 2),&lt;br&gt;       SUBSTRING(@Value, 1, LEN(@Value) - 2);&lt;br&gt;T-SQL - LEN() 関数は末尾の空白をカウントしない 3&lt;br&gt;&lt;br&gt;LEN(@Value) が最後の空白を除いた文字数を返すため、g が切れてしまっていますね。&lt;br&gt;&lt;br&gt;&lt;br&gt;末尾のスペースは無視したいような状況であれば問題ないかと思いますが、この例のような状況の場合、区切り文字列も LEN() を使ってカウントするなど、なにかしらの工夫が必要になります。&lt;br&gt;&lt;br&gt;DECLARE @Value VARCHAR(200) = &#039;Amazon, Rakuten, Yahoo Shopping, &#039;,&lt;br&gt;        @Separator VARCHAR(2) = &#039;, &#039;;&lt;br&gt;&lt;br&gt;SELECT LEFT(@Value, LEN(@Value) - LEN(@Separator)),&lt;br&gt;       SUBSTRING(@Value, 1, LEN(@Value) - LEN(@Separator));&lt;br&gt;T-SQL - LEN() 関数は末尾の空白をカウントしない 4&lt;br&gt;&lt;br&gt;&lt;br&gt;LEN() 関数が返す文字数には末尾の空白が含まれていないので、ご注意くださいね！</description><pubDate>Tue, 26 Nov 2024 13:38:00 GMT</pubDate><category>SQL Server＆T-SQLに関するコラム</category></item>
<item><title>知っておくと便利な関数 - STUFF</title><link>https://sql55.com/t-sql/t-sql-stuff.php</link><description>知っておくと便利な関数 - STUFF&lt;br&gt;&lt;br&gt;知っておくと便利な関数 - STUFF&lt;br&gt;ここでは、知っておくと便利なビルトイン関数のひとつ、STUFF 関数についてご説明します。&lt;br&gt;&lt;br&gt;&lt;br&gt;STUFF 関数&lt;br&gt;STUFF 関数は、文字列の指定した箇所を、指定した文字列に置き換えてくれる関数です。&lt;br&gt;&lt;br&gt;入力引数は 4 つで、構文は以下の通りです。&lt;br&gt;&lt;br&gt;STUFF([文字列], [開始位置], [長さ], [置き換える文字列])&lt;br&gt;[文字列] の [開始位置] から、指定した [長さ] の文字数の文字を削除して、その位置に [置き換える文字列] を挿入した文字列を返します。&lt;br&gt;&lt;br&gt;[開始位置] は、最初の文字を 1 として数え、削除の開始位置を整数で指定します。&lt;br&gt;&lt;br&gt;[開始位置] に 0 以下の値を指定したり、[文字列] の長さより大きい値を指定すると、戻り値は NULL になります。&lt;br&gt;&lt;br&gt;&lt;br&gt;[長さ] には、削除する文字数を整数で指定します。&lt;br&gt;&lt;br&gt;[長さ] にマイナスの値を指定すると、戻り値は NULL になります。&lt;br&gt;&lt;br&gt;[長さ] に 0 を指定すると、削除は行われずに、[開始位置] に [置き換える文字列] が挿入されます。&lt;br&gt;&lt;br&gt;[開始位置] + [長さ] が [文字列] の長さより大きくなる場合は、[開始位置] から [文字列] の最後までの文字が削除されて、[置き換える文字列] が挿入されます。&lt;br&gt;&lt;br&gt;また、同じ方法で、文字列の代わりにバイナリデータを置き換えることもできます。&lt;br&gt;&lt;br&gt;&lt;br&gt;それでは、STUFF 関数を使って文字列を置き換えてみましょう。&lt;br&gt;&lt;br&gt;DECLARE @Value VARCHAR(10) = &#039;ABCDEFGHIJ&#039;;&lt;br&gt;&lt;br&gt;SELECT	 STUFF(@Value, 3, 5, &#039;XXX&#039;) AS Value1,&lt;br&gt;         STUFF(@Value, 3, 0, &#039;XXX&#039;) AS Value2,&lt;br&gt;         STUFF(@Value, 3, 10, &#039;XXX&#039;) AS Value3,&lt;br&gt;         STUFF(@Value, 0, 5, &#039;XXX&#039;) AS Value4;&lt;br&gt;知っておくと便利な関数 - STUFF 1&lt;br&gt;&lt;br&gt;&lt;br&gt;Value1 は、&#039;ABCDEFGHIJ&#039; の 3 文字目から 5 文字の &#039;CDEFG&#039; が削除されて、そこに XXX が挿入され &#039;ABXXXHIJ&#039; が返っています。&lt;br&gt;&lt;br&gt;Value2 は、[長さ] が 0 なので、&#039;ABCDEFGHIJ&#039; の 3 文字目から XXX が挿入され、&#039;ABXXXCDEFGHIJ&#039; が返っています。&lt;br&gt;&lt;br&gt;Value3 は、&#039;ABCDEFGHIJ&#039; の 3 文字目以降の文字が全て削除され、そこに XXX が挿入されて &#039;ABXXX&#039; になっています。&lt;br&gt;&lt;br&gt;Value4 は、[開始位置] が 0 なので、戻り値が NULL になっています。&lt;br&gt;&lt;br&gt;&lt;br&gt;「カラムの値からカンマ区切り (CSV) の文字列を生成する」でご紹介したように、クエリーで FOR XML 句などを使って文字列をつなげて、カンマ区切りの文字列を生成した後に、1 文字目のカンマを取り除きたいような時にも STUFF 関数が使えます。&lt;br&gt;&lt;br&gt;DECLARE @Value VARCHAR(100) = &#039;,Tokyo,Osaka,Fukuoka&#039;;&lt;br&gt;&lt;br&gt;SELECT STUFF(@Value, 1, 1, &#039;&#039;) AS Value1;&lt;br&gt;知っておくと便利な関数 - STUFF 2&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、知っておくと便利なビルトイン関数のひとつ、STUFF 関数についてご説明しました。</description><pubDate>Tue, 16 Jan 2024 18:33:00 GMT</pubDate><category>T-SQL 入門</category></item>
<item><title>データベース内の全テーブル (table) を取得する</title><link>https://sql55.com/query/list-all-tables.php</link><description>データベース内の全テーブル (table) を取得する&lt;br&gt;&lt;br&gt;データベース内の全テーブル (table) を取得するには？&lt;br&gt;データベース内の全テーブル (table) の一覧を取得したり、テーブルの名前の一部を指定して、検索したりしたいような時があるかもしれません。&lt;br&gt;&lt;br&gt;何通りか方法があるので、データベース内のユーザが定義した全テーブルの一覧を取得するスクリプトをご紹介します。&lt;br&gt;&lt;br&gt;&lt;br&gt;データベース内の全テーブル (table) を取得する&lt;br&gt;まず、sys.tables というシステムカタログビューから現在のデータベース内のユーザー定義テーブルの一覧を取得することができます。&lt;br&gt;&lt;br&gt;テーブル一覧を取得したいデータベースを選択して、以下のクエリーを実行します。&lt;br&gt;&lt;br&gt;SELECT	S.name AS SchemaName,&lt;br&gt;	T.name AS TableName&lt;br&gt;FROM	sys.tables AS T&lt;br&gt;	   INNER JOIN sys.schemas AS S&lt;br&gt;	      ON T.schema_id = S.schema_id&lt;br&gt;ORDER BY S.name,&lt;br&gt;	 T.name;&lt;br&gt;データベース内の全テーブル (table) を取得する 1&lt;br&gt;&lt;br&gt;&lt;br&gt;これを使って、例えば、テーブル名に Person が入るテーブルの一覧を取得したい時は次のようにできます。&lt;br&gt;&lt;br&gt;SELECT	S.name AS SchemaName,&lt;br&gt;	T.name AS TableName&lt;br&gt;FROM	sys.tables AS T&lt;br&gt;	   INNER JOIN sys.schemas AS S&lt;br&gt;	      ON T.schema_id = S.schema_id&lt;br&gt;WHERE	T.name LIKE &#039;%Person%&#039;&lt;br&gt;ORDER BY S.name,&lt;br&gt;	 T.name;&lt;br&gt;データベース内の全テーブル (table) を取得する 2&lt;br&gt;&lt;br&gt;&lt;br&gt;先ほどの sys.tables は、sys.objects というシステムカタログビューからユーザーテーブルのみをフィルターして、テーブル情報のカラムを何個か足したものなので、以下のようにしてもユーザー定義のテーブルの一覧を取得することができます。&lt;br&gt;&lt;br&gt;sys.objects の type = &#039;U&#039; がユーザー定義のテーブルです。&lt;br&gt;&lt;br&gt;SELECT	S.name AS SchemaName,&lt;br&gt;	O.name AS TableName&lt;br&gt;FROM	sys.objects AS O&lt;br&gt;	   INNER JOIN sys.schemas AS S&lt;br&gt;	      ON O.schema_id = S.schema_id&lt;br&gt;WHERE	type = &#039;U&#039; -- U = Table (user-defined)&lt;br&gt;ORDER BY S.name,&lt;br&gt;	 O.name;&lt;br&gt;データベース内の全テーブル (table) を取得する 3&lt;br&gt;&lt;br&gt;&lt;br&gt;他には、INFORMATION_SCHEMA.TABLES というシステムインフォメーションスキーマービューでも、テーブルの一覧を取得できます。&lt;br&gt;&lt;br&gt;ユーザー定義のテーブルの情報を取得したい時は TABLE_TYPE = &#039;BASE TABLE&#039; を指定します。&lt;br&gt;&lt;br&gt;SELECT	TABLE_SCHEMA,&lt;br&gt;	TABLE_NAME&lt;br&gt;FROM	INFORMATION_SCHEMA.TABLES&lt;br&gt;WHERE	TABLE_TYPE = &#039;BASE TABLE&#039;&lt;br&gt;ORDER BY TABLE_SCHEMA,&lt;br&gt;	 TABLE_NAME;&lt;br&gt;データベース内の全テーブル (table) を取得する 4&lt;br&gt;&lt;br&gt;&lt;br&gt;いろいろ方法はありますが、テーブルのスキーマと名前だけが必要な時はどれを使っても良いと思います。 残りのカラムが違いますので、必要に応じて確認してください。&lt;br&gt;&lt;br&gt;どの方法でも、現在のユーザーにパーミッションがある table しか取得できませんので、十分権限のあるユーザーでログインして実行してくださいね。&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、データベース内のユーザが定義した全テーブルの一覧を取得するスクリプトをご紹介しました。</description><pubDate>Fri, 04 Aug 2023 18:49:00 GMT</pubDate><category>便利なT-SQL＆クエリー集</category></item>
<item><title>T-SQL - GOTO 文の使い方</title><link>https://sql55.com/t-sql/t-sql-goto.php</link><description>T-SQL の GOTO 文の使い方&lt;br&gt;ここでは、T-SQL の GOTO 文の使い方をご説明します。&lt;br&gt;&lt;br&gt;GOTO 文を使うと、指定したラベルと位置まで、処理をスキップすることができます。&lt;br&gt;&lt;br&gt;GOTO 文は多用すると、処理の流れが追いにくい、複雑なスクリプトになってしまいがちですが、便利な時もあるかと思います。&lt;br&gt;&lt;br&gt; これらのテーブルを使いますので、スクリプトを実行して確認したい方は こちら のスクリプトを実行して、Student・Test・TestResult テーブルを生成しておいてください。&lt;br&gt;&lt;br&gt;GOTO 文 は次のように定義して使えます。&lt;br&gt;&lt;br&gt;...&lt;br&gt;GOTO label_name;&lt;br&gt;...&lt;br&gt;label_name: &lt;br&gt;...&lt;br&gt;ラベル名:（コロン）で GOTO 文のとび先の場所を指定します。&lt;br&gt;&lt;br&gt;GOTO ラベル名 でその指定した場所まで処理を飛ばします。&lt;br&gt;&lt;br&gt;&lt;br&gt;実際に GOTO 文を使ってみましょう。&lt;br&gt;&lt;br&gt;次のような Student・Test・TestResult テーブル があります。&lt;br&gt;&lt;br&gt;T-SQL - GOTO 文の使い方 1&lt;br&gt;&lt;br&gt;T-SQL - GOTO 文の使い方 2&lt;br&gt;&lt;br&gt;T-SQL - GOTO 文の使い方 3&lt;br&gt;&lt;br&gt;&lt;br&gt;シンプルに JOIN すると次のようになります。&lt;br&gt;&lt;br&gt;T-SQL - GOTO 文の使い方 4&lt;br&gt;&lt;br&gt;&lt;br&gt;ここから、次の優先順位で、条件に該当する学生だれか一人のレコードを取得したいとします。&lt;br&gt;&lt;br&gt;1. 数学１で 100 点とったことある学生&lt;br&gt;2. どの科目でもいいので 100 点とったことある学生&lt;br&gt;3. どの科目でもいいので 90 点以上とったことある学生で、一番スコアが高い学生&lt;br&gt;4. どの科目でもいいので過去一番高い点数をとった学生&lt;br&gt;&lt;br&gt;&lt;br&gt;この優先順位で、条件に該当する学生だれか一人のレコードを取得するには、GOTO 文を使って次のようにできます。&lt;br&gt;&lt;br&gt;DECLARE @StudentID INT;&lt;br&gt;&lt;br&gt;-- 1. 数学１で 100 点とったことある学生&lt;br&gt;PRINT &#039;Case 1&#039;;&lt;br&gt;SELECT @StudentID = S.StudentID&lt;br&gt;FROM   TestResult AS TR&lt;br&gt;         INNER JOIN Student AS S&lt;br&gt;           ON TR.StudentID = S.StudentID&lt;br&gt;         INNER JOIN Test AS T&lt;br&gt;           ON TR.TestID = T.TestID&lt;br&gt;WHERE  T.TestNameJp = N&#039;数学１&#039;&lt;br&gt;       AND TR.Score = 100;&lt;br&gt;&lt;br&gt;IF @StudentID IS NOT NULL GOTO FOUND;&lt;br&gt;&lt;br&gt;-- 2. どの科目でもいいので 100 点とったことある学生&lt;br&gt;PRINT &#039;Case 2&#039;;&lt;br&gt;SELECT @StudentID = S.StudentID&lt;br&gt;FROM   TestResult AS TR&lt;br&gt;         INNER JOIN Student AS S&lt;br&gt;           ON TR.StudentID = S.StudentID&lt;br&gt;WHERE  TR.Score = 100;&lt;br&gt;&lt;br&gt;IF @StudentID IS NOT NULL GOTO FOUND;&lt;br&gt;&lt;br&gt;-- 3. どの科目でもいいので 90 点以上とったことある学生で、一番スコアが高い学生&lt;br&gt;PRINT &#039;Case 3&#039;;&lt;br&gt;SELECT  TOP 1&lt;br&gt;        @StudentID = S.StudentID&lt;br&gt;FROM    TestResult AS TR&lt;br&gt;          INNER JOIN Student AS S&lt;br&gt;            ON TR.StudentID = S.StudentID&lt;br&gt;WHERE   TR.Score &gt;= 90&lt;br&gt;ORDER BY TR.Score DESC;&lt;br&gt;&lt;br&gt;IF @StudentID IS NOT NULL GOTO FOUND;&lt;br&gt;&lt;br&gt;-- 4. どの科目でもいいので過去一番高い点数をとった学生&lt;br&gt;PRINT &#039;Case 4&#039;;&lt;br&gt;SELECT  TOP 1&lt;br&gt;        @StudentID = S.StudentID&lt;br&gt;FROM    TestResult AS TR&lt;br&gt;          INNER JOIN Student AS S&lt;br&gt;            ON TR.StudentID = S.StudentID&lt;br&gt;ORDER BY TR.Score DESC;&lt;br&gt;&lt;br&gt;&lt;br&gt;FOUND:&lt;br&gt;  SELECT  StudentID,&lt;br&gt;          FirstName,&lt;br&gt;          LastName&lt;br&gt;  FROM    Student&lt;br&gt;  WHERE   StudentID = @StudentID;&lt;br&gt;それぞれの、ケースの後に IF @StudentID IS NOT NULL GOTO FOUND; で、StudentID が見つかった時に GOTO 文で FOUND のラベルまで処理をスキップしています。&lt;br&gt;&lt;br&gt;[ 実行結果 ]&lt;br&gt;T-SQL - GOTO 文の使い方 5 T-SQL - GOTO 文の使い方 6&lt;br&gt;&lt;br&gt;100 点をとった学生はいないので、１番・２番の条件にあてはまる学生はおらず、３番の「3. どの科目でもいいので 90 点以上とったことある学生で、一番スコアが高い学生」に当てはまる StudentID = 4 の学生のデータが取得できています。&lt;br&gt;&lt;br&gt;Messages 画面には Case 1 ~ 3 までが Print されていて、Case 4 が Print されていないので、Case 4 のスクリプトがスキップされていることがわかります。&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、T-SQL - GOTO 文の使い方についてご説明しました。</description><pubDate>Fri, 21 Apr 2023 04:40:00 GMT</pubDate><category>T-SQL 入門</category></item>
<item><title>年・月・日 INT 型から日付 DATE 型 を生成する - DATEFROMPARTS</title><link>https://sql55.com/query/t-sql-datefromparts.php</link><description>年・月・日 INT 型から日付 DATE 型 を生成する&lt;br&gt;ここでは INT 型の年・月・日 から DATE 型の日付を生成する方法をご紹介します。&lt;br&gt;&lt;br&gt;&lt;br&gt;INT 型の年・月・日 から DATE 型の日付を生成するには、DATEFROMPARTS 関数が使えます。&lt;br&gt;&lt;br&gt;DATEFROMPARTS 関数の定義は以下の通りです。&lt;br&gt;&lt;br&gt;DATEFROMPARTS(year, month, day)&lt;br&gt;引数の year, month, day は INT 型の整数です。&lt;br&gt;&lt;br&gt;year, month, day のどれかが NULL の時は NULL を返します。&lt;br&gt;&lt;br&gt;渡された year, month, day が DATE 型に変換できない値の場合はエラーになります。&lt;br&gt;&lt;br&gt;&lt;br&gt;例えば、年: 2024、月: 1、日: 15 から DATE型の値を生成したい時は次のようにできます。&lt;br&gt;&lt;br&gt;SELECT DATEFROMPARTS(2024, 1, 15) AS ResultDate;&lt;br&gt;[ 実行結果 ]&lt;br&gt;年・月・日 INT 型から日付 DATE 型 を生成する - DATEFROMPARTS 1&lt;br&gt;&lt;br&gt;2024-01-15 が ResultDate として取得できました。&lt;br&gt;&lt;br&gt;&lt;br&gt;年: 2024、月: 1 が与えられて、それの前の年・月を取得したいような時にも DATEFROMPARTS 関数を使って、次のように取得できます。&lt;br&gt;&lt;br&gt;DECLARE @CurrYear INT = 2024,&lt;br&gt;	@CurrMonth INT = 1;&lt;br&gt;&lt;br&gt;DECLARE @CurrYearMonthDate DATE = DATEFROMPARTS(@CurrYear, @CurrMonth, 1);&lt;br&gt;DECLARE @PrevYearMonthDate DATE = DATEADD(mm, -1, @CurrYearMonthDate);&lt;br&gt;&lt;br&gt;SELECT	@CurrYearMonthDate AS CurrYearMonthDate,&lt;br&gt;	@PrevYearMonthDate AS PrevYearMonthDate,&lt;br&gt;	YEAR(@PrevYearMonthDate) AS PrevYear,&lt;br&gt;	MONTH(@PrevYearMonthDate) AS PrevMonth;&lt;br&gt;DATEFROMPARTS 関数で @CurrYearMonthDate を生成してから、DATEADD で @PrevYearMonthDate にマイナス 1 ヶ月した日付を取得しています。&lt;br&gt;&lt;br&gt;YEAR と MONTH 関数を使って @PrevYearMonthDate から前月の年と月を取得しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;これを実行すると以下のようになり、前月の 年: 2023、月: 12 が取得できていますね。&lt;br&gt;&lt;br&gt;[ 実行結果 ]&lt;br&gt;年・月・日 INT 型から日付 DATE 型 を生成する - DATEFROMPARTS 2&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、DATEFROMPARTS 関数を使って、年・月・日 INT 型から日付 DATE 型 を生成する方法をご紹介しました。</description><pubDate>Wed, 15 Feb 2023 22:39:00 GMT</pubDate><category>便利なT-SQL＆クエリー集</category></item>
<item><title>SQL Server - View の定義をクエリーで取得する方法</title><link>https://sql55.com/query/sql-server-how-to-get-defenition-of-views.php</link><description>SQL Server - View の定義をクエリーで取得する方法&lt;br&gt;ここでは、SQL Server の View の定義をクエリーで取得する方法をご説明します。&lt;br&gt;&lt;br&gt;View の定義をクエリーで取得するには、データベースを選択して、クエリエディターを開き、以下のクエリーを実行します。&lt;br&gt;&lt;br&gt;SELECT	S.name AS SchemaName,&lt;br&gt;	O.name AS ViewName,&lt;br&gt;	M.definition&lt;br&gt;FROM	sys.sql_modules AS M&lt;br&gt;	   INNER JOIN sys.objects AS O&lt;br&gt;	      ON M.object_id = O.object_id&lt;br&gt;	   INNER JOIN sys.schemas AS S&lt;br&gt;	      ON O.schema_id = S.schema_id&lt;br&gt;WHERE	O.type = &#039;V&#039; -- View&lt;br&gt;	AND O.name = &#039;ビューの名前&#039;&lt;br&gt;ORDER BY S.name,&lt;br&gt;	 O.name;&lt;br&gt;例えば、Adventure Works のサンプルデータベースで、vEmployee という名前の View の定義をクエリーで取得するには、次のようにできます。&lt;br&gt;&lt;br&gt;SELECT	S.name AS SchemaName,&lt;br&gt;	O.name AS ViewName,&lt;br&gt;	M.definition&lt;br&gt;FROM	sys.sql_modules AS M&lt;br&gt;	   INNER JOIN sys.objects AS O&lt;br&gt;	      ON M.object_id = O.object_id&lt;br&gt;	   INNER JOIN sys.schemas AS S&lt;br&gt;	      ON O.schema_id = S.schema_id&lt;br&gt;WHERE	O.type = &#039;V&#039; -- View&lt;br&gt;	AND O.name = &#039;vEmployee&#039;&lt;br&gt;ORDER BY S.name,&lt;br&gt;	 O.name;&lt;br&gt;[実行結果]&lt;br&gt;&lt;br&gt;SQL Server - View の定義をクエリーで取得する方法 1&lt;br&gt;&lt;br&gt;&lt;br&gt;この definition のカラムが View の定義ですが、これをコピーして、新しいクエリエディターの画面を開き、ペーストすると、以下のように一行になってしまいます。&lt;br&gt;&lt;br&gt;SQL Server - View の定義をクエリーで取得する方法 2&lt;br&gt;&lt;br&gt;&lt;br&gt;これは、SQL Server Management Studio の設定で、結果をグリッドに表示する際に、デフォルトで改行を保持しない設定になっているためです。&lt;br&gt;&lt;br&gt;改行を保持するように変更します。 メニューから [ツール] &gt; [オプション] で、オプション画面を開きます。&lt;br&gt;&lt;br&gt;SQL Server - View の定義をクエリーで取得する方法 3&lt;br&gt;&lt;br&gt;&lt;br&gt;[クエリ結果] &gt; [SQL Server] &gt; [結果をグリッドに表示] で、[コピーまたは保存時に CR/LF を保持] のオプションをオンにしてください。&lt;br&gt;&lt;br&gt;SQL Server - View の定義をクエリーで取得する方法 4&lt;br&gt;&lt;br&gt;&lt;br&gt;設定の変更は、既に開かているクエリエディターの画面には反映されないので、新しくクエリエディターの画面を開き、再度クエリーを実行します。&lt;br&gt;&lt;br&gt;SQL Server - View の定義をクエリーで取得する方法 5&lt;br&gt;&lt;br&gt;&lt;br&gt;definition のカラムの値をコピーし、新しくクエリエディターの画面を開き、ペーストします。&lt;br&gt;&lt;br&gt;今回は改行が保持された状態で、View の定義が取得できました。&lt;br&gt;&lt;br&gt;SQL Server - View の定義をクエリーで取得する方法 6&lt;br&gt;&lt;br&gt;&lt;br&gt;ちなみに、SQL Server Management Studio の UI から取得するには、以下のようにできます。&lt;br&gt;&lt;br&gt;SQL Server - View の定義をクエリーで取得する方法 7&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、SQL Server の View の定義をクエリーで取得する方法をご説明しました。</description><pubDate>Fri, 09 Dec 2022 22:33:00 GMT</pubDate><category>便利なT-SQL＆クエリー集</category></item>
<item><title>SQL Server Management Studio - CHECK 制約を作成する</title><link>https://sql55.com/sql-server/create-check-constraint-using-ssms.php</link><description>SQL Server Management Studio - CHECK 制約を作成する&lt;br&gt;&lt;br&gt;ここでは、SQL Server Management Studio (SSMS) を使用して、CHECK 制約を作成する方法をご説明します。&lt;br&gt;&lt;br&gt;&lt;br&gt;次のような Student テーブルがあり、データ型 CHAR(1) の Gender カラムに M か F しか入らないような CHECK 制約を SSMS から作成します。&lt;br&gt;&lt;br&gt;SQL Server Management Studio - CHECK 制約を作成する 1&lt;br&gt;&lt;br&gt;&lt;br&gt;Student テーブルを右クリックして [デザイン] (Design) を選択します。&lt;br&gt;&lt;br&gt;SQL Server Management Studio - CHECK 制約を作成する 2&lt;br&gt;&lt;br&gt;&lt;br&gt;デザイン(Design) 画面が表示されるので、 右クリックをして [CHECK 制約] (Check Constraints...) を選択します。&lt;br&gt;&lt;br&gt;SQL Server Management Studio - CHECK 制約を作成する 3&lt;br&gt;&lt;br&gt;&lt;br&gt;CHECK 制約の画面が表示されるので、 [追加] (Add) ボタンをクリックします。&lt;br&gt;&lt;br&gt;SQL Server Management Studio - CHECK 制約を作成する 4&lt;br&gt;&lt;br&gt;&lt;br&gt;Gender カラムに M か F しか入ってほしくないので、式 (Expression) に Gender IN (&#039;M&#039;,&#039;F&#039;) を追加します。&lt;br&gt;&lt;br&gt;名前 (Name) は、今回は CK_Student_Gender に変更して、[閉じる] (Close) ボタンをクリックします。&lt;br&gt;&lt;br&gt;SQL Server Management Studio - CHECK 制約を作成する 5&lt;br&gt;&lt;br&gt;&lt;br&gt;デザイン画面に戻るので、保存ボタンをクリックするか CTRL+S のショートカットキーで変更を保存します。&lt;br&gt;&lt;br&gt;SQL Server Management Studio - CHECK 制約を作成する 6&lt;br&gt;&lt;br&gt;&lt;br&gt;これで Student テーブルに CHECK 制約が追加できました。&lt;br&gt;&lt;br&gt;SQL Server Management Studio - CHECK 制約を作成する 7&lt;br&gt;&lt;br&gt;&lt;br&gt;試しに Student テーブルの Gender カラムの値を M・F 以外の値に変更してみます。&lt;br&gt;&lt;br&gt;Student テーブルで右クリックして [上位 200 行の編集] (Edit Top 200 Rows) を選択します。&lt;br&gt;&lt;br&gt;SQL Server Management Studio - CHECK 制約を作成する 8&lt;br&gt;&lt;br&gt;&lt;br&gt;編集画面が表示されるので、Gender の値を C に変更して確定しようとすると、次のように CHECK 制約のエラーで行が更新されなかったというメッセージが表示されます。&lt;br&gt;&lt;br&gt;SQL Server Management Studio - CHECK 制約を作成する 9&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、SQL Server Management Studio (SSMS) を使用して、CHECK 制約を作成する方法をご説明しました。</description><pubDate>Sat, 03 Sep 2022 05:57:00 GMT</pubDate><category>Microsoft SQL Server 入門</category></item>
<item><title>SQL Server - Msg 402 データ型 datetime と time は add 演算子では互換性がありませんのエラーと対処方法</title><link>https://sql55.com/column/sql-server-date-and-datetime-incompatible-in-add-operator.php</link><description>SQL Server - Msg 402 データ型 datetime と time は add 演算子では互換性がありませんのエラーと対処方法&lt;br&gt;&lt;br&gt; &lt;br&gt;SQL Server - Msg 402 データ型 datetime と time は add 演算子では互換性がありませんのエラーと対処方法&lt;br&gt;企業向けのシステムでは、SQL Sever のバージョンをアップグレードしても、最初にリリースした時の SQL Server データベースの互換性レベル (compatibility level) で運用することも少なくないと思います。&lt;br&gt;&lt;br&gt;互換性レベルがサポートなると、新しいバージョンの SQL Server データベースの互換性レベルにアップグレードせざるを得ない日がやってくると思います。&lt;br&gt;&lt;br&gt;&lt;br&gt;SQL Server 2008 R2 までは OK だったのに、SQL Server 2012 以降ではエラーになる構文のひとつに、DATETIME、DATE、TIME 型の値の add 演算があります。&lt;br&gt;&lt;br&gt;例えば、日付 DATETIME 型と時間 TIME 型を + で足して、日時の DATETIME 型の値を取得している箇所があると、SQL Server 2012 以降では次のようなエラーになります。&lt;br&gt;&lt;br&gt;Msg 402, Level 16, State 1, Line 6&lt;br&gt;データ型 datetime と time は add 演算子では互換性がありません。&lt;br&gt;Msg 402, Level 16, State 1, Line 6&lt;br&gt;The data types datetime and time are incompatible in the add operator.&lt;br&gt;- (subtract) 演算子も同様です。&lt;br&gt;&lt;br&gt;&lt;br&gt;エラーにならないようにするには、データ型を合わせてから足すように変更することで回避できます。&lt;br&gt;&lt;br&gt;例えば、DATETIME 型の @InDate の値と TIME 型の @InTime の値を加えて、DATETIME を取得したい時は次のようにできます。&lt;br&gt;&lt;br&gt;DECLARE @InDate DATETIME = &#039;12/6/2023&#039;,&lt;br&gt;	@InTime TIME = &#039;14:32&#039;;&lt;br&gt;&lt;br&gt;SELECT	@InDate AS InDate,&lt;br&gt;	CAST(@InTime AS DATETIME) AS InTime_DateTime,&lt;br&gt;	@InDate + CAST(@InTime AS DATETIME) AS Combined_InDateTime;&lt;br&gt;SQL Server - Msg 402 データ型 datetime と time は add 演算子では互換性がありませんのエラー 1&lt;br&gt;&lt;br&gt;@InTime を DATETIME 型に変換して @InDate と足し合わすことで、@InDate と @InTime を合わせた日時が得られています。&lt;br&gt;&lt;br&gt;TIME 型の値を DATETIME 型に変換すると日付けの部分が 1900-01-01 になりますが、add 演算子で足し合わせても年の部分が 2023 + 1900 となるわけではなく、時間のみが加算されます。&lt;br&gt;&lt;br&gt;&lt;br&gt;@InDate が DATE 型だった場合は、 @InDate も DATETIME に CAST してから時間を足し合わせます。&lt;br&gt;&lt;br&gt;DECLARE @InDate DATE = &#039;12/6/2023&#039;,&lt;br&gt;	@InTime TIME = &#039;14:32&#039;;&lt;br&gt;&lt;br&gt;SELECT	CAST(@InDate AS DATETIME) AS InDate,&lt;br&gt;	CAST(@InTime AS DATETIME) AS InTime_DateTime,&lt;br&gt;	CAST(@InDate AS DATETIME) + CAST(@InTime AS DATETIME) AS Combined_InDateTime;&lt;br&gt;SQL Server - Msg 402 データ型 datetime と time は add 演算子では互換性がありませんのエラー 2&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、SQL Server - Msg 402 データ型 datetime と time は add 演算子では互換性がありませんのエラーと対処方法についてご紹介しました。</description><pubDate>Wed, 27 Jul 2022 23:17:00 GMT</pubDate><category>SQL Server＆T-SQLに関するコラム</category></item>
<item><title>SQL Server - メンテナンスクリーンアップタスクでファイルが削除されない時の対処方法</title><link>https://sql55.com/sql-server/sql-server-maintenance-cleanup-task-not-deleting-files.php</link><description>SQL Server - メンテナンスクリーンアップタスクでファイルが削除されない時の対処方法&lt;br&gt;&lt;br&gt; &lt;br&gt;SQL Serer の メンテナンスプランで、データベースのバックアップをとったり、古くなったバックアップファイルを削除したりすることがあると思います。&lt;br&gt;&lt;br&gt;ここでは、メンテナンスクリーンアップタスクで、データベースのバックアップファイルを削除するように設定していて、実行結果は成功ステータスなのにファイルは削除されない、という時の原因のひとつと対処方法をご紹介します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;メンテナンスクリーンアップタスクの設定と状況の確認&lt;br&gt;メンテナンスクリーンアップタスクでファイルが削除されない時の対処方法&lt;br&gt;メンテナンスクリーンアップタスクの設定と状況の確認&lt;br&gt;今回の例では、次のように SQL Server のメンテナンスプランで、1 日一回 12:00 AM にデータベースのフルバックアップを取ってから、メンテナンスクリーンアップタスクで古いバックアップファイルを削除します。&lt;br&gt;&lt;br&gt;SQL Server - メンテナンスクリーンアップタスクでファイルが削除されない時の対処方法 1&lt;br&gt;&lt;br&gt;&lt;br&gt;メンテナンスクリーンアップタスクの設定は次のようになっていて、C:\Test\MYSQL\Backup フォルダ内の、一週間より前に作成された bak 拡張子のファイルを削除するように設定しています。&lt;br&gt;&lt;br&gt;SQL Server - メンテナンスクリーンアップタスクでファイルが削除されない時の対処方法 2&lt;br&gt;&lt;br&gt;&lt;br&gt;このメンテナンスプランを実行すると以下のように成功しているように見えるのに、bak ファイルは削除されていないというような状況が起こった時の対処方法のひとつを今回はご説明します。&lt;br&gt;&lt;br&gt;SQL Server - メンテナンスクリーンアップタスクでファイルが削除されない時の対処方法 2-1&lt;br&gt;&lt;br&gt;&lt;br&gt;メンテナンスクリーンアップタスクでファイルが削除されない時の対処方法&lt;br&gt;実行が成功しているのに、メンテナンスクリーンアップタスクでファイルが削除されない時には、フォルダの権限が足りていない可能性があります。&lt;br&gt;&lt;br&gt;解決方法のひとつとして SQL Server のデフォルトの Backup フォルダと同様に、メンテナンスクリーンアップタスクで指定しているフォルダに NT SERVICE⧹MSSQLSERVER のアカウントにフルコントロールのアクセス許可を与えることによって解決されることがあります。&lt;br&gt;&lt;br&gt; NT SERVICE\MSSQLSERVER はデータベースエンジンサービスの既定のインスタンスの仮想アカウントです。&lt;br&gt;[SQL Server のデフォルトの backup フォルダの権限]&lt;br&gt;&lt;br&gt;SQL Server - メンテナンスクリーンアップタスクでファイルが削除されない時の対処方法 3&lt;br&gt;&lt;br&gt;&lt;br&gt;メンテナンスクリーンアップタスクで指定しているフォルダを右クリックして、プロパティ画面のセキュリティタブを開きます。&lt;br&gt;&lt;br&gt;MSSQLSERVER は存在していないので、[編集] ボタンをクリックします。&lt;br&gt;&lt;br&gt;SQL Server - メンテナンスクリーンアップタスクでファイルが削除されない時の対処方法 4&lt;br&gt;&lt;br&gt;&lt;br&gt;[追加] ボタンをクリックします。&lt;br&gt;&lt;br&gt;SQL Server - メンテナンスクリーンアップタスクでファイルが削除されない時の対処方法 5&lt;br&gt;&lt;br&gt;&lt;br&gt;場所にローカルのコンピュータを選択し、オブジェクト名に NT SERVICE\MSSQLSERVER と入力し、[名前の確認] ボタンをクリックします。&lt;br&gt;&lt;br&gt;SQL Server - メンテナンスクリーンアップタスクでファイルが削除されない時の対処方法 6&lt;br&gt;&lt;br&gt;&lt;br&gt;複数の名前が見つかった場合は MSSQLSERVER を選択して、[OK] ボタンをクリックします。&lt;br&gt;&lt;br&gt;SQL Server - メンテナンスクリーンアップタスクでファイルが削除されない時の対処方法 7&lt;br&gt;&lt;br&gt;&lt;br&gt;MSSQLSERVER が選択されたことを確認して、 [OK] ボタンをクリックします。&lt;br&gt;&lt;br&gt;SQL Server - メンテナンスクリーンアップタスクでファイルが削除されない時の対処方法 8&lt;br&gt;&lt;br&gt;&lt;br&gt;MSSQLSERVER を選択し、フルコントロールにチェックを入れて、[OK] ボタンをクリックします。&lt;br&gt;&lt;br&gt;SQL Server - メンテナンスクリーンアップタスクでファイルが削除されない時の対処方法 9&lt;br&gt;&lt;br&gt;&lt;br&gt;メンテナンスクリーンアップタスクで指定しているフォルダに、NT SERVICE⧹MSSQLSERVER アカウントにフルコントロールのアクセス許可を与えることができました。&lt;br&gt;&lt;br&gt;SQL Server - メンテナンスクリーンアップタスクでファイルが削除されない時の対処方法 10&lt;br&gt;&lt;br&gt;これで、再度メンテナンスクリーンアップタスクを実行してみてください。&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、メンテナンスクリーンアップタスクでファイルが削除されない原因のひとつと対処方法をご紹介しました。</description><pubDate>Mon, 18 Jul 2022 18:38:00 GMT</pubDate><category>Microsoft SQL Server 入門</category></item>
<item><title>SQL Server - Excel からのデータインポートで 255 文字より多い文字数のデータをインポートする方法</title><link>https://sql55.com/sql-server/sql-server-excel-data-import-longer-than-255-characters.php</link><description>SQL Server - Excel からのデータインポートで 255 文字より多い文字数のデータをインポートする方法&lt;br&gt;&lt;br&gt; &lt;br&gt;SQL Serer Management Studio の SQL Server インポートおよびエクスポートウィザードを使って Excel ファイルのデータを SQL Server のデータベースにインポートすることがあると思います。&lt;br&gt;&lt;br&gt;便利な機能ですが、セルに 255 文字より多い文字数が入っている時に、255 文字で切れてインポートされることがあります。&lt;br&gt;&lt;br&gt;この記事では、255 文字でデータが切り捨てされないようにする方法をご紹介します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;Excel インポートで 255 文字で切り捨てされる現象の再現&lt;br&gt;Excel インポートで 255 文字で切り捨てされる原因と対処方法&lt;br&gt;Excel インポートで 255 文字で切り捨てされる現象の再現&lt;br&gt;まずは、Excel インポートで 255 文字で切り捨てされる現象を再現してみます。&lt;br&gt;&lt;br&gt;次のような Excel ファイルを SQL Server インポートおよびエクスポートウィザードを使って、ローカルにある Test1 というデータベースにインポートします。&lt;br&gt;&lt;br&gt;SQL Server - Excel からのデータインポートで 255 文字より多い文字数のデータをインポートする方法 1&lt;br&gt;&lt;br&gt;&lt;br&gt;Item20 の ItemDescription には、長さが 380 の文字列が入っています。&lt;br&gt;&lt;br&gt;SQL Server - Excel からのデータインポートで 255 文字より多い文字数のデータをインポートする方法 2&lt;br&gt;&lt;br&gt;&lt;br&gt;この Items.xlsx ファイルを SQL Server インポートおよびエクスポートウィザードを使ってインポートします。&lt;br&gt;&lt;br&gt; SQL Server Management Studio - Excel ファイルをインポートする方法の詳細を知りたい方は、SQL Server Management Studio - Excel ファイルをインポートする をご覧ください。&lt;br&gt;&lt;br&gt;データソースに Items.xlsx ファイルを指定します。&lt;br&gt;&lt;br&gt;SQL Server - Excel からのデータインポートで 255 文字より多い文字数のデータをインポートする方法 3&lt;br&gt;&lt;br&gt;&lt;br&gt;変換先にローカルの Test1 データベースを指定します。&lt;br&gt;&lt;br&gt;SQL Server - Excel からのデータインポートで 255 文字より多い文字数のデータをインポートする方法 4&lt;br&gt;&lt;br&gt;&lt;br&gt;変更先のテーブル名を Temp_Items に変更して、[マッピングの編集] ボタンをクリックします。&lt;br&gt;&lt;br&gt;SQL Server - Excel からのデータインポートで 255 文字より多い文字数のデータをインポートする方法 6&lt;br&gt;&lt;br&gt;&lt;br&gt;ItemDescription の Size が 255 になっていて、後で結果がわかりますが、ここで max に変更してもデータは 255 文字で切り捨てられてしまいます。&lt;br&gt;&lt;br&gt;SQL Server - Excel からのデータインポートで 255 文字より多い文字数のデータをインポートする方法 7&lt;br&gt;&lt;br&gt;SQL Server - Excel からのデータインポートで 255 文字より多い文字数のデータをインポートする方法 8&lt;br&gt;&lt;br&gt;&lt;br&gt;この状態でウィザードを進め、データをインポートします。&lt;br&gt;&lt;br&gt;SQL Server - Excel からのデータインポートで 255 文字より多い文字数のデータをインポートする方法 12&lt;br&gt;&lt;br&gt;&lt;br&gt;Test1 データベースを確認すると、Temp_Items という名前のテーブルができていて、ItemDescription のデータ型は NVARCHAR(MAX) になっています。&lt;br&gt;&lt;br&gt;SQL Server - Excel からのデータインポートで 255 文字より多い文字数のデータをインポートする方法 13&lt;br&gt;&lt;br&gt;&lt;br&gt;ですが、Temp_Items テーブルのデータを確認すると、Item20 の ItemDescription の長さは 255 になっています。&lt;br&gt;&lt;br&gt;SQL Server - Excel からのデータインポートで 255 文字より多い文字数のデータをインポートする方法 14&lt;br&gt;&lt;br&gt;&lt;br&gt;Excel インポートで 255 文字で切り捨てされる原因と対処方法&lt;br&gt;このように SQL Server インポートおよびエクスポートウィザードを使って Excel ファイルのデータを SQL Server のデータベースにインポートしたときに 255 文字で切り捨てられることがある原因は、ドライバーがデータ型を決定する際の設定にあります。&lt;br&gt;&lt;br&gt;デフォルトでは、カラムのデータ型を調べるのに、最初の 8 行分のデータを確認して、最も多いデータ型に決定されるようになっています。&lt;br&gt;&lt;br&gt;ですので、最初の 8 行目までに文字数の多いデータが入っていれば大丈夫なのですが、そうでないと、今回のように 255 文字で切れてしまいます。&lt;br&gt;&lt;br&gt;&lt;br&gt;データ型を調べる行数は TypeGuessRows というエントリで設定されています。&lt;br&gt;&lt;br&gt;SQL Server - Excel からのデータインポートで 255 文字より多い文字数のデータをインポートする方法 14-2&lt;br&gt;&lt;br&gt;[参考] Microsoft Office Excel ドライバーの初期化&lt;br&gt;&lt;br&gt;&lt;br&gt;ドライバーはレジストリにある TypeGuessRows の値を使うので、その値を変更することによって、データ型を調べる行数をかえることができます。&lt;br&gt;&lt;br&gt;Office 2016 の場合は TypeGuessRows の値は、以下の場所にありますが、HKEY_LOCAL_MACHINE の下で TypeGuessRows で検索すると出てくると思います。&lt;br&gt;&lt;br&gt;[MSI インストールの場合]&lt;br&gt;* For 32-bit Office on 32-bit Windows or 64-bit Office on 64-bit Windows:&lt;br&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\16.0\Access Connectivity Engine\Engines\Excel&lt;br&gt;&lt;br&gt;* For 32-bit Office on 64-bit Windows:&lt;br&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\16.0\Access Connectivity Engine\Engines\Excel&lt;br&gt;&lt;br&gt;[システムのクイック実行インストールの場合]&lt;br&gt;* For 32-bit Office on 32-bit Windows or 64-bit Office on 64-bit Windows:&lt;br&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\REGISTRY\MACHINE\Software\Microsoft\Office\16.0\Access Connectivity Engine\Engines\Excel&lt;br&gt;&lt;br&gt;* For 32-bit Office on 64-bit Windows:&lt;br&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\REGISTRY\MACHINE\Software\Wow6432Node\Microsoft\Office\16.0\Access Connectivity Engine\Engines\Excel&lt;br&gt;&lt;br&gt;&lt;br&gt;私の環境では HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\REGISTRY\MACHINE\Software\Microsoft\Office\16.0\Access Connectivity Engine\Engines\Excel にありました。&lt;br&gt;&lt;br&gt;SQL Server - Excel からのデータインポートで 255 文字より多い文字数のデータをインポートする方法 15&lt;br&gt;&lt;br&gt;&lt;br&gt;TypeGuessRows のデフォルトは 8 になっています。この値を 0 に設定すると、ドライバーは最初の 16,384 行をチェックします。&lt;br&gt;&lt;br&gt;もしインポートする行数が 16,384 行を超える可能性があり、すべての行を確認したい場合は Excel の行の最大値の 1,048,576 を設定してください。&lt;br&gt;&lt;br&gt;ここでは TypeGuessRows を 8 から 0 に変更します。&lt;br&gt;&lt;br&gt;SQL Server - Excel からのデータインポートで 255 文字より多い文字数のデータをインポートする方法 16&lt;br&gt;&lt;br&gt;SQL Server - Excel からのデータインポートで 255 文字より多い文字数のデータをインポートする方法 17&lt;br&gt;&lt;br&gt;SQL Server - Excel からのデータインポートで 255 文字より多い文字数のデータをインポートする方法 18&lt;br&gt;&lt;br&gt;&lt;br&gt;Test1 データベースの Temp_Items テーブルを削除して、もう一度インポートしてみます。&lt;br&gt;&lt;br&gt;[マッピングの編集] 画面では先ほど 255 だった部分が自動的に max になっています。&lt;br&gt;&lt;br&gt;SQL Server - Excel からのデータインポートで 255 文字より多い文字数のデータをインポートする方法 19&lt;br&gt;&lt;br&gt;&lt;br&gt;そのままウィザードを進め、データをインポートします。&lt;br&gt;&lt;br&gt;SQL Server - Excel からのデータインポートで 255 文字より多い文字数のデータをインポートする方法 20&lt;br&gt;&lt;br&gt;&lt;br&gt;Test1 データベースを確認すると、Temp_Items テーブルができていて、ItemDescription のデータ型は NVARCHAR(MAX) になっています。&lt;br&gt;&lt;br&gt;SQL Server - Excel からのデータインポートで 255 文字より多い文字数のデータをインポートする方法 21&lt;br&gt;&lt;br&gt;&lt;br&gt;そして、Temp_Items テーブルのデータを確認すると、Item20 の ItemDescription の長さは、ちゃんと 380 になっています。&lt;br&gt;&lt;br&gt;SQL Server - Excel からのデータインポートで 255 文字より多い文字数のデータをインポートする方法 22&lt;br&gt;&lt;br&gt;&lt;br&gt;最後に、長い文字列が入ってくる可能性のあるカラムがひとつしか存在せず、レコードの順番が重要でない場合、レジストリを変更せずに、一番長い文字列が入ってるレコードを上にもってくるように Excel でソートしてから、SQL Server にインポートするのもひとつの手かと思います。&lt;br&gt;&lt;br&gt;以上、Exce から SQL Server へのデータインポートで 255 文字より多い文字数のデータをインポートする方法をご紹介しました。</description><pubDate>Mon, 25 Apr 2022 23:52:00 GMT</pubDate><category>Microsoft SQL Server 入門</category></item>
<item><title>SQL Server - 最後に出現する文字列のインデックス位置 (LastIndexOf) や、その左側や右側の文字列を取り出す方法</title><link>https://sql55.com/query/sql-server-get-last-index-of-string.php</link><description>SQL Server - 最後に出現する文字列のインデックス位置 (LastIndexOf) や、その左側や右側の文字列を取り出す方法&lt;br&gt;&lt;br&gt; &lt;br&gt;最後に出現する文字列のインデックス位置やその左側や右側の文字列を取り出す方法&lt;br&gt;T-SQL では、指定した文字列が最初に出現するインデックス位置は CHARINDEX() で取得できますが、最後に出現するインデックス位置を返す、LastIndexOf のような組み込み関数がありません。&lt;br&gt;&lt;br&gt;ここでは、最後に出現する文字列のインデックス位置の取得方法と、最後に出現する文字列の左側や右側の文字列を取り出す方法をご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;最後に出現する文字列のインデックス位置を取得する (LastIndexOf)&lt;br&gt;最後に出現する文字列の左側の文字列を取得する&lt;br&gt;最後に出現する文字列の右側の文字列を取得する&lt;br&gt;最後に出現する文字列のインデックス位置を取得する (LastIndexOf)&lt;br&gt;T-SQL で指定した文字列が、最後に出現する文字列のインデックス位置を取得するには、次のようにできます。&lt;br&gt;&lt;br&gt;DECLARE @StringToSearch VARCHAR(50) = &#039;ABCDE-FGHIJ-123&#039;;&lt;br&gt;DECLARE @StringToFind VARCHAR(10) = &#039;-&#039;&lt;br&gt;&lt;br&gt;IF CHARINDEX(@StringToFind, @StringToSearch) &gt; 0&lt;br&gt;BEGIN&lt;br&gt;   SELECT LEN(@StringToSearch) - CHARINDEX(@StringToFind, REVERSE(@StringToSearch)) - LEN(@StringToFind) + 2&lt;br&gt;END &lt;br&gt;ELSE&lt;br&gt;BEGIN	&lt;br&gt;   SELECT 0;&lt;br&gt;END&lt;br&gt;@StringToFind が最後の出現位置をさがしたい文字列、@StringToSearch が検索される文字列です。&lt;br&gt;&lt;br&gt;CHARINDEX(@StringToFind, @StringToSearch) &gt; 0 で @StringToFind が @StringToSearch の中に存在するか確認し、存在しない時は ELSE で 0 を返すようにしています。&lt;br&gt;&lt;br&gt;存在する時は、REVERSE() を使って @StringToSearch を反対にしてから、CHARINDEX で @StringToFind の最初の出現位置を取得し、@StringToSearch の文字数からその数と、@StringToFind の文字数を引いて、2 を足すことによって、@StringToFind が最後に出現するインデックス位置を取得しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;[実行結果]&lt;br&gt;&lt;br&gt;SQL Server - 最後に出現する文字列のインデックス位置 (LastIndexOf) や、その左側や右側の文字列を取り出す方法 1&lt;br&gt;&lt;br&gt;SQL Server - 最後に出現する文字列のインデックス位置 (LastIndexOf) や、その左側や右側の文字列を取り出す方法 2&lt;br&gt;&lt;br&gt;SQL Server - 最後に出現する文字列のインデックス位置 (LastIndexOf) や、その左側や右側の文字列を取り出す方法 3&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;最後に出現する文字列の左側の文字列を取得する&lt;br&gt;T-SQL で指定した文字列が、最後に出現する文字列の左側の文字列を取得するには、次のようにできます。&lt;br&gt;&lt;br&gt;DECLARE @StringToSearch VARCHAR(50) = &#039;ABCDE-FGHIJ-123&#039;&lt;br&gt;DECLARE @StringToFind VARCHAR(10) = &#039;-&#039;&lt;br&gt;&lt;br&gt;IF CHARINDEX(@StringToFind, @StringToSearch) &gt; 0&lt;br&gt;BEGIN&lt;br&gt;   SELECT LEFT(@StringToSearch, LEN(@StringToSearch) - CHARINDEX(@StringToFind, REVERSE(@StringToSearch)) - LEN(@StringToFind) + 1);&lt;br&gt;END &lt;br&gt;ELSE&lt;br&gt;BEGIN	&lt;br&gt;   SELECT &#039;&#039;;&lt;br&gt;END&lt;br&gt;@StringToFind が最後の出現位置をさがしたい文字列、@StringToSearch が検索される文字列です。&lt;br&gt;&lt;br&gt;CHARINDEX(@StringToFind, @StringToSearch) &gt; 0 で @StringToFind が @StringToSearch の中に存在するか確認し、存在しない時は ELSE で空の文字列を返すようにしています。&lt;br&gt;&lt;br&gt;存在する時は LEFT(文字列, 文字数) を使って、最後に出現する @StringToFind の左側の文字を取り出します。&lt;br&gt;&lt;br&gt;取得したい文字数は先ほど取得した [最後に出現する文字列のインデックス位置] - 1 になるので、LEN(@StringToSearch) - CHARINDEX(@StringToFind, REVERSE(@StringToSearch)) - LEN(@StringToFind) + 1 になります。&lt;br&gt;&lt;br&gt;&lt;br&gt;[実行結果]&lt;br&gt;&lt;br&gt;SQL Server - 最後に出現する文字列のインデックス位置 (LastIndexOf) や、その左側や右側の文字列を取り出す方法 4&lt;br&gt;&lt;br&gt;SQL Server - 最後に出現する文字列のインデックス位置 (LastIndexOf) や、その左側や右側の文字列を取り出す方法 5&lt;br&gt;&lt;br&gt;SQL Server - 最後に出現する文字列のインデックス位置 (LastIndexOf) や、その左側や右側の文字列を取り出す方法 6&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;最後に出現する文字列の右側の文字列を取得する&lt;br&gt;T-SQL で指定した文字列が、最後に出現する文字列の右側の文字列を取得するには、次のようにできます。&lt;br&gt;&lt;br&gt;DECLARE @StringToSearch VARCHAR(50) = &#039;ABCDE--FGHIJ--123&#039;&lt;br&gt;DECLARE @StringToFind VARCHAR(10) = &#039;--&#039;&lt;br&gt;&lt;br&gt;IF CHARINDEX(@StringToFind, @StringToSearch) &gt; 0&lt;br&gt;BEGIN&lt;br&gt;   SELECT RIGHT(@StringToSearch, CHARINDEX(@StringToFind, REVERSE(@StringToSearch)) - 1);&lt;br&gt;END&lt;br&gt;ELSE&lt;br&gt;BEGIN	&lt;br&gt;   SELECT &#039;&#039;;&lt;br&gt;END&lt;br&gt;@StringToFind が最後の出現位置をさがしたい文字列、@StringToSearch が検索される文字列です。&lt;br&gt;&lt;br&gt;CHARINDEX(@StringToFind, @StringToSearch) &gt; 0 で @StringToFind が @StringToSearch の中に存在するか確認し、存在しない時は ELSE で空の文字列を返すようにしています。&lt;br&gt;&lt;br&gt;存在する時は RIGHT(文字列, 文字数) を使って、最後に出現する @StringToFind の右側の文字を取り出します。&lt;br&gt;&lt;br&gt;CHARINDEX(@StringToFind, REVERSE(@StringToSearch)) で @StringToSearch を反対にしてから、CHARINDEX で @StringToFind の最初の出現位置を取得すると、その数 - 1 が取得したい文字数になります&lt;br&gt;&lt;br&gt;&lt;br&gt;[実行結果]&lt;br&gt;&lt;br&gt;SQL Server - 最後に出現する文字列のインデックス位置 (LastIndexOf) や、その左側や右側の文字列を取り出す方法 7&lt;br&gt;&lt;br&gt;SQL Server - 最後に出現する文字列のインデックス位置 (LastIndexOf) や、その左側や右側の文字列を取り出す方法 8&lt;br&gt;&lt;br&gt;SQL Server - 最後に出現する文字列のインデックス位置 (LastIndexOf) や、その左側や右側の文字列を取り出す方法 9&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、最後に出現する文字列のインデックス位置の取得方法と、最後に出現する文字列の左側や右側の文字列を取り出す方法をご紹介しました。</description><pubDate>Thu, 17 Feb 2022 23:02:00 GMT</pubDate><category>便利なT-SQL＆クエリー集</category></item>
<item><title>T-SQL: 複数行のカラムの値からひとつの文字列を生成する方法</title><link>https://sql55.com/query/concatenate-multiple-rows-into-string.php</link><description>T-SQL: 複数行のカラムの値からひとつの文字列を生成する方法&lt;br&gt;&lt;br&gt; &lt;br&gt;複数行のカラムの値からひとつの文字列を生成する方法&lt;br&gt;SQL のスクリプトで、複数行のカラムの値から、カンマ区切り (CSV) や改行を入れて、ひとつの文字列を生成したいような時ありませんか。&lt;br&gt;&lt;br&gt;いろんなやり方があると思いますが、複数行のカラムの値からひとつの文字列を生成する方法をひとつご紹介します。&lt;br&gt;&lt;br&gt;&lt;br&gt; サンプルデータベースのテーブルを使いますので、実際にスクリプトを実行してみたい方は、こちら のスクリプトを実行して、Student テーブルを生成しておいてください。&lt;br&gt;&lt;br&gt;以下のような Student テーブル があります。&lt;br&gt;&lt;br&gt;複数行のカラムの値からひとつの文字列を生成する方法 1&lt;br&gt;&lt;br&gt;&lt;br&gt;ここから FirstName と LastName 順で連番をふって並べ替え、改行を入れてつなげた、以下のようなひとつの文字列を取得したいとします。&lt;br&gt;&lt;br&gt;複数行のカラムの値からひとつの文字列を生成する方法 2&lt;br&gt;&lt;br&gt;&lt;br&gt;複数行をつなげて、ひとつの文字列にするには、FOR XML PATH を使ったり、STRING_AGG() 関数を使ったり、いろんな方法がありますが、ここでは COALESCE() 関数を使います。&lt;br&gt;&lt;br&gt;FirstName と LastName 順で連番をふって並べ替え、改行でつなげてひとつの文字列を取得するクエリーは以下の通りです。&lt;br&gt;&lt;br&gt;DECLARE @StudentInfo NVARCHAR(MAX); &lt;br&gt;&lt;br&gt;SELECT	@StudentInfo = COALESCE(@StudentInfo + CHAR(13) + CHAR(10), &#039;&#039;) &lt;br&gt;			+ CAST(ROW_NUMBER() OVER (ORDER BY FirstName, LastName) AS NVARCHAR(20))&lt;br&gt;			+ &#039;: &#039;&lt;br&gt;			+ ISNULL(FirstName, &#039;&#039;) &lt;br&gt;			+ &#039; &#039; &lt;br&gt;			+ ISNULL(LastName, &#039;&#039;)&lt;br&gt;FROM	Student&lt;br&gt;ORDER BY FirstName,&lt;br&gt;	 LastName;&lt;br&gt;&lt;br&gt;SELECT @StudentInfo;&lt;br&gt;COALESCE() 関数をつかって、@StudentInfo に一行分の文字列 + 改行(CR/LF) を、順番に行数分追加していくようにして、ひとつの文字列につなげています。&lt;br&gt;&lt;br&gt;一行分の文字列は 連番: FirstName LastName です。&lt;br&gt;&lt;br&gt;連番は ROW_NUMBER() で FirstName, LastName 順に連番をふって、それを NVARCHAR(20) にキャストしています。&lt;br&gt;&lt;br&gt;文字列を + でつなげる時は、ひとつでも NULL が全体が NULL になってしまうので、NULL になる可能性のある時はお気をつけください。&lt;br&gt;&lt;br&gt;&lt;br&gt;このクエリーを SQL Server Management Studio で実行しますが、デフォルトの結果をグリッドに表示する方法では、改行が入っているのがわかりにくいので、結果をテキストに表示するように変更してクエリーを実行します。&lt;br&gt;&lt;br&gt;複数行のカラムの値からひとつの文字列を生成する方法 3&lt;br&gt;&lt;br&gt;@StudentInfo に 連番: FirstName LastName が改行でつながった、文字列が入っているのがわかります。&lt;br&gt;&lt;br&gt; おまけですが、結果をグリッドに表示して値をコピー＆ペーストすると、SSMS のデフォルトの設定では改行文字が取り除かれます。&lt;br&gt;&lt;br&gt;複数行のカラムの値からひとつの文字列を生成する方法 4&lt;br&gt;&lt;br&gt;&lt;br&gt;カンマ区切りでつなげたい時は CHAR(13) + CHAR(10) の部分を &#039;,&#039; に変更すれば取得できます。&lt;br&gt;&lt;br&gt;DECLARE @StudentInfo NVARCHAR(MAX); &lt;br&gt;&lt;br&gt;SELECT	@StudentInfo = COALESCE(@StudentInfo + &#039;,&#039;, &#039;&#039;) &lt;br&gt;			+ CAST(ROW_NUMBER() OVER (ORDER BY FirstName, LastName) AS NVARCHAR(20))&lt;br&gt;			+ &#039;: &#039;&lt;br&gt;			+ ISNULL(FirstName, &#039;&#039;) &lt;br&gt;			+ &#039; &#039; &lt;br&gt;			+ ISNULL(LastName, &#039;&#039;)&lt;br&gt;FROM	Student&lt;br&gt;ORDER BY FirstName,&lt;br&gt;	 LastName;&lt;br&gt;&lt;br&gt;SELECT @StudentInfo;&lt;br&gt;複数行のカラムの値からひとつの文字列を生成する方法 5&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、複数行のカラムの値からひとつの文字列を生成する方法をご紹介しました。</description><pubDate>Fri, 21 Jan 2022 22:52:00 GMT</pubDate><category>便利なT-SQL＆クエリー集</category></item>
<item><title>SQL Server サーバー・データベースロールとその設定方法</title><link>https://sql55.com/sql-server/sql-server-roles.php</link><description>SQL Server サーバー・データベースロールとその設定方法&lt;br&gt;&lt;br&gt; &lt;br&gt;SQL Server では、ユーザーの権限を管理を簡単にするために、固定サーバーレベルのロールと、データベースレベルのロールが用意されています。&lt;br&gt;&lt;br&gt;ここでは、固定サーバーレベルのロールと、データベースレベルのロールと設定方法についてご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;固定サーバーレベルのロールとは？&lt;br&gt;固定データベースレベルのロールとは？&lt;br&gt;SSMS からユーザーにサーバーロールを設定する方法&lt;br&gt;SSMS からユーザーにデータベースロールを設定する方法&lt;br&gt;固定サーバーレベルのロールとは？&lt;br&gt;固定のサーバーレベルのロールとは、サーバーに対しての権限をまとめたものです。&lt;br&gt;&lt;br&gt;ログインユーザーに対してサーバーロールを設定することで、ひとつひとつサーバーに対してできる権限を許可していくのではなく、まとまった権限を与えることができます。&lt;br&gt;&lt;br&gt;ログインユーザーに複数のサーバーロールを設定したり、ユーザー定義のサーバーロールを作成して設定することも可能です。&lt;br&gt;&lt;br&gt;&lt;br&gt;なんでもできる固定サーバーロールは sysadmin で、一番権限がないのが public です。&lt;br&gt;&lt;br&gt;他には serveradmin、securityadmin、processadmin、setupadmin、bulkadmin、diskadmin、dbcreator があります。&lt;br&gt;&lt;br&gt;&lt;br&gt;マイクロソフトのサイトに、サーバーロールとパーミッションの関係を示した、わかりやすい表がありましたので、載せておきます。&lt;br&gt;&lt;br&gt;SQL Server サーバー・データベースロールとその設定方法 1&lt;br&gt;&lt;br&gt;[Reference] Server-Level Roles - SQL Server | Microsoft Docs&lt;br&gt;&lt;br&gt;&lt;br&gt;固定のデータベースレベルのロールとは？&lt;br&gt;固定のデータベースレベルのロールとは、データベースに対しての権限をまとめたものです。&lt;br&gt;&lt;br&gt;データベースユーザーに対してデータベースのロールを設定することで、データベースに対してできる権限をひとつずつ許可していくのではなく、まとめて権限を与えることができます。&lt;br&gt;&lt;br&gt;複数のデータベースロールを割り当てたり、ユーザー定義のデータベースロールを作成して割り当てることも可能です。&lt;br&gt;&lt;br&gt;&lt;br&gt;固定のデータベースロールには db_owner、db_securityadmin、db_accessadmin、db_backupoperator、db_ddladmin、db_datawriter、db_datareader、db_denydatawriter、db_denydatareader があります。&lt;br&gt;&lt;br&gt;データベースに対して何でもできるのが db_owner、SELECT だけできるのが db_datareader、INSERT/UPDATE/DELETE ができるのが db_datawriter です。&lt;br&gt;&lt;br&gt;&lt;br&gt;SQL Server サーバー・データベースロールとその設定方法 2&lt;br&gt;&lt;br&gt;[Reference] Database-Level Roles - SQL Server | Microsoft Docs&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;SSMS からユーザーにサーバーロールを設定する方法&lt;br&gt;SQL Server Management Studio から、ログインユーザーにサーバーロールを設定する方法をご説明します。&lt;br&gt;&lt;br&gt;オブジェクトエクスプローラーの [セキュリティ] &gt; [ログイン] で右クリックして [新しいログイン] を選択します。&lt;br&gt;&lt;br&gt;SQL Server サーバー・データベースロールとその設定方法 3&lt;br&gt;&lt;br&gt;&lt;br&gt;新規ログイン作成の画面が表示されるので、左側で [サーバーロール] ページを選択します。&lt;br&gt;&lt;br&gt;画面にサーバーロールの一覧が表示されるので、ここでログインユーザーにサーバーロールを設定できます。&lt;br&gt;&lt;br&gt;SQL Server サーバー・データベースロールとその設定方法 4&lt;br&gt;&lt;br&gt;既存のログインのサーバーロールを変更したい時は、ログインで右クリックしてプロパティを表示すると、同様にサーバーロールを選択するページがでてきます。&lt;br&gt;&lt;br&gt;&lt;br&gt;SSMS からユーザーにデータベースロールを設定する方法&lt;br&gt;SQL Server Management Studio から、データベースユーザーにデータベースロールを設定する方法をご紹介します。&lt;br&gt;&lt;br&gt;新しいログインを生成時に同時に設定することができます。&lt;br&gt;&lt;br&gt;オブジェクトエクスプローラーの [セキュリティ] &gt; [ログイン] で右クリックして [新しいログイン] を選択します。&lt;br&gt;&lt;br&gt;SQL Server サーバー・データベースロールとその設定方法 3&lt;br&gt;&lt;br&gt;&lt;br&gt;新規ログイン作成の画面が表示されるので、左側で [ユーザーマッピング] ページを選択します。&lt;br&gt;&lt;br&gt;上のグリッドでユーザーをマップするデータベースを選択します。&lt;br&gt;&lt;br&gt;そうすると、下にそのデータベースのデータベースロールが表示されるので、ここでデータベースユーザにデータベースロールを設定できます。&lt;br&gt;&lt;br&gt;SQL Server サーバー・データベースロールとその設定方法 5&lt;br&gt;&lt;br&gt;&lt;br&gt;既存のデータベースユーザーのデータベースロールを変更したい時は、[データベース] &gt; [セキュリティ] &gt; [ユーザー]でユーザーを右クリックして [プロパティ] を選択します。&lt;br&gt;&lt;br&gt;SQL Server サーバー・データベースロールとその設定方法 6&lt;br&gt;&lt;br&gt;&lt;br&gt;データベースユーザーのプロパティ画面が表示されるので、左側で [メンバーシップ] ページを選択します。&lt;br&gt;&lt;br&gt;画面にデータベースロールの一覧が表示されるので、ここでデータベースユーザーににデータベースロールを設定できます。&lt;br&gt;&lt;br&gt;SQL Server サーバー・データベースロールとその設定方法 7&lt;br&gt;&lt;br&gt;&lt;br&gt; 固定データベースロールに EXECUTE に対する権限を与えるものがないので、ストアドプロシージャやファンクションなどの実行を許可したい時はユーザーに対して GRANT するか、 EXECUTE を許可したデータベースロールを作って、ユーザーに設定しても良いと思います。&lt;br&gt;&lt;br&gt;GRANT EXECUTE TO [ユーザー名]&lt;br&gt;CREATE ROLE [execute用ロール名];&lt;br&gt;GRANT EXECUTE TO [execute用ロール名];&lt;br&gt;&lt;br&gt;以上、固定サーバーレベルのロールと、データベースレベルのロールと設定方法についてご説明しました。</description><pubDate>Tue, 04 Jan 2022 22:27:00 GMT</pubDate><category>Microsoft SQL Server 入門</category></item>
<item><title>SQL Server: T-SQL で現在のデータベース名を取得する方法</title><link>https://sql55.com/query/sql-server-how-to-get-the-current-database-name.php</link><description>SQL Server: T-SQL で現在のデータベース名を取得する方法&lt;br&gt;&lt;br&gt; &lt;br&gt;SQL Server: T-SQL で現在のデータベース名を取得する方法&lt;br&gt;環境ごとにデータベース名が違って、現在のデータベース名を取得して、ダイナミッククエリなどを生成して実行したいような時があるかもしれません。&lt;br&gt;&lt;br&gt;ここでは、SQL Server で現在のデータベース名を取得する組み込み関数をご紹介します。&lt;br&gt;&lt;br&gt;&lt;br&gt;DB_NAME() で現在のデータベース名を取得する&lt;br&gt;SQL Server の T-SQL で現在のデータベース名を取得するには、組み込み関数の DB_NAME() が使えます。&lt;br&gt;&lt;br&gt;DB_NAME() の構文は以下の通りです。&lt;br&gt;&lt;br&gt;DB_NAME([database_id])&lt;br&gt;オプショナルで database_id を引数として受け取り、その database_id のデータベース名を返します。&lt;br&gt;&lt;br&gt;引数の database_id を渡さなかったときは、現在のデータベース名が返ります。&lt;br&gt;&lt;br&gt;戻り値のデータ型は NVARCHAR(128) です。&lt;br&gt;&lt;br&gt;&lt;br&gt;例えば、AdventureWorks2019 データベースが選択された状態で、次のクエリーを実行すると、現在のデータベース名の AdventureWorks2019 が取得できます。&lt;br&gt;&lt;br&gt;SELECT DB_NAME() AS DatabaseName;&lt;br&gt;[実行結果]&lt;br&gt;&lt;br&gt;T-SQL で現在のデータベース名を取得する方法 1&lt;br&gt;&lt;br&gt;&lt;br&gt;database_id = 12 のデータベース名を取得したいような時は、次のようにできます。&lt;br&gt;&lt;br&gt;[実行結果]&lt;br&gt;&lt;br&gt;T-SQL で現在のデータベース名を取得する方法 2&lt;br&gt;&lt;br&gt;T-SQL で現在のデータベース名を取得する方法 3&lt;br&gt;&lt;br&gt;database_id = 12 のデータベースは Test データベースなので、Test という名前が返っています。&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、SQL Server で現在のデータベース名を取得する組み込み関数をご紹介しました。</description><pubDate>Fri, 12 Nov 2021 22:47:00 GMT</pubDate><category>便利なT-SQL＆クエリー集</category></item>
<item><title>SQL Server の ISOLATION LEVEL（トランザクション分離レベル）とは？</title><link>https://sql55.com/column/sql-server-isolation-level.php</link><description>SQL Server の ISOLATION LEVEL（トランザクション分離レベル）とは？&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは、SQL Server の ISOLATION LEVEL（トランザクション分離レベル）についてご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;SQL Server の ISOLATION LEVEL とは？&lt;br&gt;ISOLATION LEVEL - READ UNCOMMITTED とは？&lt;br&gt;ISOLATION LEVEL - READ COMMITTED とは？&lt;br&gt;ISOLATION LEVEL - REPEATABLE READ とは？&lt;br&gt;ISOLATION LEVEL - SNAPSHOT とは？&lt;br&gt;ISOLATION LEVEL - SERIALIZABLE とは？&lt;br&gt;ISOLATION LEVEL の設定の方法&lt;br&gt;SQL Server の ISOLATION LEVEL とは？&lt;br&gt;SQL Server の ISOLATION LEVEL はトランザクションの処理中に、他のトランザクションからのアクセスに対して、どの程度データをロックするかをコントロールするためのものです。&lt;br&gt;&lt;br&gt;ISOLATION LEVEL が高くなればなるほど、データはロックされてデータの整合性などは保たれますが、その間他のトランザクションは処理を待たなければいけなくなるので、並行で処理ができなくなります。&lt;br&gt;&lt;br&gt;反対に ISOLATION LEVEL を低くすると、同時にできる処理は増えますが、まだコミットされていないデータを他のトランザクションが読むなどして、データの整合性などに問題が出てくる場合があります。&lt;br&gt;&lt;br&gt;ですので状況に応じて、適切な ISOLATION LEVEL を使い分ける必要があります。&lt;br&gt;&lt;br&gt;&lt;br&gt;SQL Server の ISOLATION LEVEL は次の 5 つがありますので順番にご紹介します。&lt;br&gt;&lt;br&gt;SNAPSHOT 以外は、ANSI/ISO SQL 標準で定められている分離レベルで、上から下へ分離レベルが高くなっていきます。&lt;br&gt;&lt;br&gt;READ UNCOMMITTED&lt;br&gt;READ COMMITTED&lt;br&gt;REPEATABLE READ&lt;br&gt;SNAPSHOT&lt;br&gt;SERIALIZABLE&lt;br&gt;&lt;br&gt;ISOLATION LEVEL - READ UNCOMMITTED とは？&lt;br&gt;READ UNCOMMITTED は、他のトランザクションが変更してまだコミットしていないデータを読む (Dirty Read) ことができる ISOLATION LEVEL です。&lt;br&gt;&lt;br&gt;5 つの中で、一番低い ISOLATION LEVEL です。&lt;br&gt;&lt;br&gt;変更中のデータを取得しても問題がない時には、READ UNCOMMITTED を指定すると、他のトランザクションが終わるのを待たずにデータが取得できます。&lt;br&gt;&lt;br&gt;SELECT 文のテーブルに NOLOCK のテーブルヒントをつけても READ UNCOMMITTED と同等の動きになります。&lt;br&gt;&lt;br&gt;&lt;br&gt;ISOLATION LEVEL - READ COMMITTED とは？&lt;br&gt;READ COMMITTED は、他のトランザクションが変更してまだコミットしていないデータは読めない ISOLATION LEVEL です。&lt;br&gt;&lt;br&gt;ですので Dirty Read 問題は防げますが、他のトランザクションがデータを変更することができるため、トランザクション内で同じデータを繰り返し読み込むときに、値が変わってしまっている可能性があります。&lt;br&gt;&lt;br&gt;この、READ COMMITTED のトランザクション分離レベルが、SQL Server のデフォルトです。&lt;br&gt;&lt;br&gt;&lt;br&gt;ISOLATION LEVEL - REPEATABLE READ とは？&lt;br&gt;REPEATABLE READ は、他のトランザクションが変更してまだコミットしていないデータを読むことができないようにし、かつ shared lock で他のトランザクションが現在のトランザクションが読んだデータを変更できないようにする ISOLATION LEVEL です。&lt;br&gt;&lt;br&gt;READ COMMITTED と違って、このトランザクション内では同じデータは何度読み込んでも同じ値になります。&lt;br&gt;&lt;br&gt;ただ、他のトランザクションが、このトランザクション内で取得したデータの検索条件に合致するようなデータを追加することができます。&lt;br&gt;&lt;br&gt;ですので、同じトランザクション内で同じクエリーでデータを複数回取得した際に、同じデータが得られない場合があります。&lt;br&gt;&lt;br&gt;&lt;br&gt;ISOLATION LEVEL - SNAPSHOT とは？&lt;br&gt;SNAPSHOT は、SQL Server 特有のトランザクション分離レベルで、トランザクションが開始した時にコミット済みのデータのスナップショットをトランザクション内で使用する ISOLATION LEVEL です。&lt;br&gt;&lt;br&gt;トランザクションが開始した後に、他のトランザクションが変更したデータは、このトランザクションには影響を与えません。&lt;br&gt;&lt;br&gt;SNAPSHOT のトランザクション分離レベルを使うには、ALLOW_SNAPSHOT_ISOLATION のデータベースオプションを ON にする必要があります。&lt;br&gt;&lt;br&gt;データがロックされないので並行性は高まりますが、その分リソースを使います。&lt;br&gt;&lt;br&gt;&lt;br&gt;ISOLATION LEVEL - SERIALIZABLE とは？&lt;br&gt;SERIALIZABLE は、一番高い ISOLATION LEVEL で、他のトランザクションはこのトランザクションが読んだデータを変更したり、このトランザクションが取得した検索条件に合致するようなデータを追加したりすることができません。&lt;br&gt;&lt;br&gt;他のトランザクションが変更してコミットされていないようなデータを読むこともできません。&lt;br&gt;&lt;br&gt;他のトランザクションの影響を受けずに、安全にデータを処理することができますが、その分並行性は低くなります。&lt;br&gt;&lt;br&gt;同じテーブル、カラム、インデックスなどを使った SERIALIZABLE 分離レベルのトランザクションが複数同時に実行されていると、処理の順番によってはデッドロックも起こりやすくなります。&lt;br&gt;&lt;br&gt;&lt;br&gt;ISOLATION LEVEL の設定の方法&lt;br&gt;SQL Server で ISOLATION LEVEL を設定するには SET TRANSACTION ISOLATION LEVEL を使います。&lt;br&gt;&lt;br&gt;SET TRANSACTION ISOLATION LEVEL トランザクション分離レベル;&lt;br&gt;設定できる [トランザクション分離レベル] は次のうちのどれかです。&lt;br&gt;&lt;br&gt;READ UNCOMMITTED&lt;br&gt;READ COMMITTED&lt;br&gt;REPEATABLE READ&lt;br&gt;SNAPSHOT&lt;br&gt;SERIALIZABLE&lt;br&gt;&lt;br&gt;例えば、SQL Server Profile で SQL Server Management Studio からの Audit Login のトレースの TextData を見てみると、TRANSACTION ISOLATION LEVEL を READ COMMITTED に設定していることがわかります。&lt;br&gt;&lt;br&gt;-- network protocol: LPC&lt;br&gt;set quoted_identifier on&lt;br&gt;set arithabort off&lt;br&gt;set numeric_roundabort off&lt;br&gt;set ansi_warnings on&lt;br&gt;set ansi_padding on&lt;br&gt;set ansi_nulls on&lt;br&gt;set concat_null_yields_null on&lt;br&gt;set cursor_close_on_commit off&lt;br&gt;set implicit_transactions off&lt;br&gt;set language us_english&lt;br&gt;set dateformat mdy&lt;br&gt;set datefirst 7&lt;br&gt;set transaction isolation level read committed&lt;br&gt;SQL Server の ISOLATION LEVEL（トランザクション分離レベル）1&lt;br&gt;&lt;br&gt;&lt;br&gt;ちなみに SSMS から実行するクエリのデフォルトの分離レベルを変更したい時は [ツール] &gt; [オプション] メニューを開きます。&lt;br&gt;&lt;br&gt;SQL Server の ISOLATION LEVEL（トランザクション分離レベル）2&lt;br&gt;&lt;br&gt;&lt;br&gt;[クエリ実行] &gt; [SQL Server] &gt; [Advanced] の SET TRANSACTION ISOLATION LEVEL で設定できます。&lt;br&gt;&lt;br&gt;SQL Server の ISOLATION LEVEL（トランザクション分離レベル）3&lt;br&gt;&lt;br&gt;変更した設定は、新しいコネクションから有効になります。&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、SQL Server の ISOLATION LEVEL（トランザクション分離レベル）についてご説明しました。</description><pubDate>Fri, 08 Oct 2021 23:25:00 GMT</pubDate><category>SQL Server＆T-SQLに関するコラム</category></item>
<item><title>SQL Server Management Studio - 改行入りのデータを CSV ファイルにエクスポートする</title><link>https://sql55.com/sql-server/ssms-export-data-with-carriage-returns-to-csv.php</link><description>SQL Server Management Studio - 改行入りのデータを CSV ファイルにエクスポートする&lt;br&gt;&lt;br&gt; &lt;br&gt;以前、「SQL Server Management Studio - 改行入りのデータを Excel にエクスポートする」では、SQL Server Management Studio のデータのエクスポート機能を使って、改行入りのデータを Excel ファイルにエクスポートする方法をご紹介しました。&lt;br&gt;&lt;br&gt;ここでは、SQL Server Management Studio を使って、改行入りのデータを CSV ファイルにエクスポートする方法をご紹介します。&lt;br&gt;&lt;br&gt;エクスポート機能でデータ変換時にエラーになる場合は、こちらもお試しください。&lt;br&gt;&lt;br&gt;&lt;br&gt;SQL Server Management Studio で改行入りのデータを CSV ファイルにエクスポートする&lt;br&gt;それでは、SQL Server Management Studio で改行入りのデータを CSV ファイルにエクスポートする方法を順番にご説明します。&lt;br&gt;&lt;br&gt;次のような Student テーブルがあります。&lt;br&gt;&lt;br&gt;SSMS - 改行入りのデータを CSV ファイルにエクスポートする 1&lt;br&gt;&lt;br&gt;StudentID = 2 の Memo カラムの値には次のような改行の入った値が保存されてります。&lt;br&gt;&lt;br&gt;１行目&lt;br&gt;２行目&lt;br&gt;３行目&lt;br&gt;&lt;br&gt;クエリエディターの結果グリッドで、レコードを選択して、右クリックでヘッダー付きでコピーして Excel ファイルに貼り付けてみます。&lt;br&gt;&lt;br&gt;SSMS - 改行入りのデータを CSV ファイルにエクスポートする 2&lt;br&gt;&lt;br&gt;SSMS - 改行入りのデータを CSV ファイルにエクスポートする 3&lt;br&gt;&lt;br&gt;SSMS 2016 以降では、結果グリッドからコピーまたは保存時に CR/LF を保持するかどうかが選択できるようになりました。&lt;br&gt;&lt;br&gt;デフォルトでは保持しない設定になっている為、改行がスペースに置き換えられ、一行になって貼り付けされます。&lt;br&gt;&lt;br&gt;&lt;br&gt;CSV ファイルに結果グリッドのデータを改行入りで保存するために、改行を保持する設定に変更します。&lt;br&gt;&lt;br&gt;メニューから [ツール] &gt; [オプション] を選択し、オプション画面を開きます。&lt;br&gt;&lt;br&gt;[クエリ結果] &gt; [SQL Server] &gt; [結果をグリッドに表示] を左側で選択し、[コピーまたは保存時に CR/LF を保持] のオプションのチェックをオンに変更し、OK ボタンをクリックします。&lt;br&gt;&lt;br&gt;SSMS - 改行入りのデータを CSV ファイルにエクスポートする 4&lt;br&gt;&lt;br&gt;&lt;br&gt;既に開いているクエリエディターは古い設定のままなので、新しいクエリエディターを開いてクエリーを実行します。&lt;br&gt;&lt;br&gt;結果グリッドで先ほどと同様にデータをコピーして Excel ファイルに貼り付けると次のようになります。&lt;br&gt;&lt;br&gt;SSMS - 改行入りのデータを CSV ファイルにエクスポートする 5&lt;br&gt;&lt;br&gt;改行が入っているので、貼り付けた時に Memo カラムの値が別の行とみなされてしまいます。&lt;br&gt;&lt;br&gt;&lt;br&gt;改行入りのデータをひとつのカラムの値として保持させるために、CSV ファイルに保存します。&lt;br&gt;&lt;br&gt;クエリエディターの結果グリッドで、レコードを選択して、右クリックで [結果に名前をつけて保存] を選択します。&lt;br&gt;&lt;br&gt;SSMS - 改行入りのデータを CSV ファイルにエクスポートする 6&lt;br&gt;&lt;br&gt;&lt;br&gt;CSV ファイルとして保存します。&lt;br&gt;&lt;br&gt;SSMS - 改行入りのデータを CSV ファイルにエクスポートする 7&lt;br&gt;&lt;br&gt;&lt;br&gt;生成した CSV ファイルを開いてみます。&lt;br&gt;&lt;br&gt;SSMS - 改行入りのデータを CSV ファイルにエクスポートする 8&lt;br&gt;&lt;br&gt;ヘッダーは入っていませんが、改行が保持された状態で、結果セットをエクスポートすることができました。&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、SQL Server Management Studio を使って、改行入りのデータを CSV ファイルにエクスポートする方法をご紹介しました。</description><pubDate>Wed, 14 Jul 2021 06:58:00 GMT</pubDate><category>Microsoft SQL Server 入門</category></item>
<item><title>SQL Server - 二つのテーブルのデータが完全に同じか比較する方法</title><link>https://sql55.com/query/how-to-check-if-two-tables-have-the-same-data.php</link><description>SQL Server - 二つのテーブルのデータが完全に同じか比較する方法&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは、SQL Server で二つのテーブルのデータが完全に同じか比較する方法をご説明します。&lt;br&gt;&lt;br&gt;テーブルの差分を比較する方法はいろいろありますが、今回は EXCEPT と JOIN を使う方法をご紹介します。&lt;br&gt;&lt;br&gt;二つのテーブルは全く同じ構造で、ユニークで NOT NULL のキーとなるカラムが存在する前提でおこないます。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;二つのテーブルを比較するサンプルデータを生成する&lt;br&gt;EXCEPT を使って二つのテーブルのデータを比較する&lt;br&gt;JOIN を使って二つのテーブルのデータを比較する&lt;br&gt;二つのテーブルを比較するサンプルデータを生成する&lt;br&gt;二つのテーブルのデータを比較するために、以下のスクリプトを実行して Student1 と Student2 テーブルを作ります。&lt;br&gt;&lt;br&gt;StudentID がプライマリーキーです。&lt;br&gt;&lt;br&gt;※ Student1 と Student2 テーブルがデータベースに既に存在している時は削除されてしまいますのでご注意ください。&lt;br&gt;&lt;br&gt;IF OBJECT_ID(N&#039;dbo.Student1&#039;, N&#039;U&#039;) IS NOT NULL DROP TABLE Student1;&lt;br&gt;IF OBJECT_ID(N&#039;dbo.Student2&#039;, N&#039;U&#039;) IS NOT NULL DROP TABLE Student2;&lt;br&gt;&lt;br&gt;CREATE TABLE Student1 (&lt;br&gt;   StudentID INT NOT NULL IDENTITY(1,1) PRIMARY KEY,&lt;br&gt;   FirstName VARCHAR(50) NULL,&lt;br&gt;   LastName VARCHAR(50) NULL,&lt;br&gt;   Birthday DATE NULL,&lt;br&gt;   Gender CHAR(1) NULL&lt;br&gt;);&lt;br&gt;&lt;br&gt;CREATE TABLE Student2 (&lt;br&gt;   StudentID INT NOT NULL IDENTITY(1,1) PRIMARY KEY,&lt;br&gt;   FirstName VARCHAR(50) NULL,&lt;br&gt;   LastName VARCHAR(50) NULL,&lt;br&gt;   Birthday DATE NULL,&lt;br&gt;   Gender CHAR(1) NULL&lt;br&gt;);&lt;br&gt;&lt;br&gt;INSERT INTO Student1&lt;br&gt;  (FirstName, LastName, Birthday, Gender)&lt;br&gt; VALUES&lt;br&gt;  (&#039;Taro&#039;, &#039;Yamada&#039;, &#039;2011-02-10&#039;, &#039;M&#039;),&lt;br&gt;  (&#039;Hanako&#039;, &#039;Tanaka&#039; ,&#039;2010-12-30&#039;, &#039;F&#039;),&lt;br&gt;  (&#039;Yuko&#039;, &#039;Suzuki&#039;, &#039;2010-07-07&#039;, &#039;F&#039;),&lt;br&gt;  (&#039;Makoto&#039;, &#039;Sato&#039;, &#039;2011-03-12&#039;, &#039;M&#039;),&lt;br&gt;  (&#039;Hiroki&#039;, &#039;Takagi&#039;, &#039;2010-04-05&#039;, &#039;M&#039;);&lt;br&gt;&lt;br&gt;&lt;br&gt;INSERT INTO Student2&lt;br&gt;  (FirstName, LastName, Birthday, Gender)&lt;br&gt; VALUES&lt;br&gt;  (&#039;Taro&#039;, &#039;Yamada&#039;, &#039;2011-02-15&#039;, &#039;M&#039;),&lt;br&gt;  (&#039;Hanako&#039;, &#039;Tanaka&#039; ,&#039;2010-12-30&#039;, &#039;F&#039;),&lt;br&gt;  (&#039;Yuko&#039;, &#039;Suzuki&#039;, &#039;2010-07-07&#039;, &#039;F&#039;),&lt;br&gt;  (&#039;Makoto&#039;, &#039;Sato&#039;, &#039;2011-03-12&#039;, &#039;M&#039;),&lt;br&gt;  (&#039;Hiroki&#039;, &#039;Takagi&#039;, &#039;2010-04-05&#039;, &#039;M&#039;),&lt;br&gt;  (&#039;Yuka&#039;, &#039;Kimura&#039;, &#039;2012-03-27&#039;, &#039;F&#039;);&lt;br&gt;以下の緑の部分が違っている箇所です。&lt;br&gt;&lt;br&gt;SQL Server - 二つのテーブルのデータが完全に同じか比較する方法 1&lt;br&gt;&lt;br&gt;&lt;br&gt;EXCEPT を使って二つのテーブルのデータを比較する&lt;br&gt;まずは、EXCEPT 演算子 を使って二つのテーブルのデータが完全に同じかを比較する方法です。&lt;br&gt;&lt;br&gt;EXCEPT 演算子は EXCEPT の左側の結果セットに存在していて、右側の結果セットには存在していない値のみを返してくれるオペレータで、構文は次の通りです。&lt;br&gt;&lt;br&gt;[ クエリー 1 ] EXCEPT [ クエリー 2 ]&lt;br&gt;EXCEPT 演算子の結果セットは DISTINCT な値を返します。&lt;br&gt;&lt;br&gt;それぞれのクエリーは、カラムの数、順番が一致 していなければなりません。&lt;br&gt;&lt;br&gt;また、データ型も一致しているか、暗黙に同じ型に変換可能 なものでなければなりません。&lt;br&gt;&lt;br&gt;&lt;br&gt;EXCEPT 演算子を使って Student1 に存在していて、Student2 に存在しないデータと、Student2 に存在していて Student1 に存在しないデータを確認します。&lt;br&gt;&lt;br&gt;SELECT	*&lt;br&gt;FROM	Student1&lt;br&gt;EXCEPT&lt;br&gt;SELECT	*&lt;br&gt;FROM	Student2;&lt;br&gt;&lt;br&gt;SELECT	*&lt;br&gt;FROM	Student2&lt;br&gt;EXCEPT&lt;br&gt;SELECT	*&lt;br&gt;FROM	Student1;&lt;br&gt;SQL Server - 二つのテーブルのデータが完全に同じか比較する方法 2&lt;br&gt;&lt;br&gt;二つのテーブルのカラム数、データ型、カラムの順番が一致しているので * で比較できます。&lt;br&gt;&lt;br&gt;EXCEPT を使うと DISTINCT な値で比較するので、全く同じ値のレコードが片方のテーブルに多く存在していたとしても、差分として出てきません。&lt;br&gt;&lt;br&gt;ですが、プライマリーキーカラムが含まれているため、ひとつのテーブルに重複データが存在しないので大丈夫です。&lt;br&gt;&lt;br&gt;&lt;br&gt;もし、テーブルが同じかどうかを取得したいのであれば、上の結果セットの存在を確認することで取得できます。&lt;br&gt;&lt;br&gt;IF NOT EXISTS&lt;br&gt;     (SELECT *&lt;br&gt;      FROM   Student1&lt;br&gt;      EXCEPT&lt;br&gt;      SELECT *&lt;br&gt;      FROM   Student2)&lt;br&gt;   AND NOT EXISTS &lt;br&gt;     (SELECT *&lt;br&gt;      FROM   Student2&lt;br&gt;      EXCEPT&lt;br&gt;      SELECT *&lt;br&gt;      FROM   Student1)&lt;br&gt;BEGIN&lt;br&gt;   SELECT &#039;Same&#039; AS Result;&lt;br&gt;END&lt;br&gt;ELSE&lt;br&gt;BEGIN&lt;br&gt;   SELECT &#039;Different&#039; AS Result;&lt;br&gt;END&lt;br&gt;SQL Server - 二つのテーブルのデータが完全に同じか比較する方法 3&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;JOIN を使って二つのテーブルのデータを比較する&lt;br&gt;次は JOIN を使って、二つのテーブルのデータが完全に同じか比較する方法です。&lt;br&gt;&lt;br&gt;ユニークで NOT NULL なキーをカラムを使って、二つのテーブルを結合します。&lt;br&gt;&lt;br&gt;&lt;br&gt;まず、キーとなるカラムで INNER JOIN してそれ以外のカラムの値がひとつでも等しくないレコードを抽出します。&lt;br&gt;&lt;br&gt;等しいかどうかをチェックする際には値に NULL があるとその条件式が TRUE になることはないので気をつけてくださいね。&lt;br&gt;&lt;br&gt;次に、二つのテーブルをキーとなるカラムで LEFT JOIN して、左側のテーブル 1 にあって右側のテーブル 2 にないレコードを抽出します。&lt;br&gt;&lt;br&gt;そして、テーブルを反対にして LEFT JOIN して、左側のテーブル 2 にあって右側のテーブル 1 にないレコードを抽出します。&lt;br&gt;&lt;br&gt;テーブルを反対にせずに RIGHT JOIN を使っても大丈夫です。&lt;br&gt;&lt;br&gt;&lt;br&gt;この三つのクエリーを実行することで、二つのテーブルのデータで一致していない差分のレコードを取得することができます。&lt;br&gt;&lt;br&gt;SELECT T1.*,&lt;br&gt;       T2.*&lt;br&gt;FROM   Student1 AS T1&lt;br&gt;          INNER JOIN Student2 AS T2&lt;br&gt;            ON T1.StudentID = T2.StudentID&lt;br&gt;WHERE  ISNULL(T1.FirstName, &#039;&#039;) &lt;&gt; ISNULL(T2.FirstName, &#039;&#039;)&lt;br&gt;       OR ISNULL(T1.LastName, &#039;&#039;) &lt;&gt; ISNULL(T2.LastName, &#039;&#039;)&lt;br&gt;       OR ISNULL(T1.Birthday, &#039;1900-01-01&#039;) &lt;&gt; ISNULL(T2.Birthday, &#039;1900-01-01&#039;)&lt;br&gt;       OR ISNULL(T1.Gender, &#039;&#039;) &lt;&gt; ISNULL(T2.Gender, &#039;&#039;);&lt;br&gt;&lt;br&gt;SELECT T1.*,&lt;br&gt;       T2.*&lt;br&gt;FROM   Student1 AS T1&lt;br&gt;	   LEFT JOIN Student2 AS T2&lt;br&gt;	      ON T1.StudentID = T2.StudentID&lt;br&gt;WHERE  T2.StudentID IS NULL;&lt;br&gt;&lt;br&gt;SELECT T1.*,&lt;br&gt;       T2.*&lt;br&gt;FROM   Student2 AS T2&lt;br&gt;           LEFT JOIN Student1 AS T1&lt;br&gt;	      ON T2.StudentID = T1.StudentID&lt;br&gt;WHERE  T1.StudentID IS NULL;&lt;br&gt;SQL Server - 二つのテーブルのデータが完全に同じか比較する方法 4&lt;br&gt;&lt;br&gt;もし、テーブルが同じかどうかだけを取得したいのであれば、先ほどの EXCEPT と同様に上の三つのクエリーの結果セットの存在を確認することで取得できますね。&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、SQL Server で二つのテーブルのデータが完全に同じか比較する方法をご紹介しました。&lt;br&gt;&lt;br&gt;</description><pubDate>Fri, 18 Jun 2021 01:55:00 GMT</pubDate><category>便利なT-SQL＆クエリー集</category></item>
<item><title>SQL Server デフォルトインスタンスへのリモート接続の設定方法</title><link>https://sql55.com/column/how-to-set-up-remote-access-to-sql-server-default-instance.php</link><description>SQL Server デフォルトインスタンスへのリモート接続の設定方法&lt;br&gt;&lt;br&gt; &lt;br&gt;SQL Server デフォルトインスタンスへのリモート接続の設定方法&lt;br&gt;今回は SQL Server のデフォルトインスタンスのデータベースエンジンに、リモートで接続するための設定方法についてです。&lt;br&gt;&lt;br&gt;この記事では 「 クライアント PC の SQL Server Management Studio から、IP アドレス 192.168.0.27 のサーバ上にある、MSSQLSERVER というデフォルトインスタンスのデータベースエンジンに SQL Server 認証を使って接続する。 」 というのを目的として進めていきます。&lt;br&gt;&lt;br&gt; 同じサーバにデフォルトインスタンスの SQL Server だけではなく、名前付きインスタンスも存在し、両方に接続したい方は「SQL Server 名前付きインスタンスへのリモート接続の設定方法」をご覧ください。&lt;br&gt;それでは、リモートで接続するための設定のポイントをひとつずつ見ていきましょう。&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;ステップ 1: SQL Server 認証が有効化されているか確認する&lt;br&gt;データベースサーバー上のSQL Server Management Studio でデータベースエンジンに接続し、オブジェクトエクスプローラーでサーバーを右クリックし、プロパティーを開きます。&lt;br&gt;&lt;br&gt;SQL Server リモート接続の設定方法 1&lt;br&gt;&lt;br&gt;&lt;br&gt;セキュリティーページのサーバー認証モードが [SQL Server 認証モードと Windows 認証モード] になっていなければ、[SQL Server 認証モードと Windows 認証モード] に変更、OK をクリックします。&lt;br&gt;&lt;br&gt;SQL Server リモート接続の設定方法 2&lt;br&gt;&lt;br&gt;&lt;br&gt;ステップ 2: TCP/IP を有効化する&lt;br&gt;スタートメニューの 「 ファイル名を指定して実行 」 で、バージョンに応じて以下のどれかのファイル名を指定して実行し、SQL Server 構成マネージャーを開きます。&lt;br&gt;&lt;br&gt;SQL Server 2019 -&gt; SQLServerManager15.msc&lt;br&gt;SQL Server 2017 -&gt; SQLServerManager14.msc&lt;br&gt;SQL Server 2016 -&gt; SQLServerManager13.msc&lt;br&gt;SQL Server 2014 -&gt; SQLServerManager12.msc&lt;br&gt;SQL Server 2012 -&gt; SQLServerManager11.msc&lt;br&gt;&lt;br&gt;左側の 「SQL Server ネットワークの構成」で、接続したいデフォルトインスタンスのプロトコルをクリックし、右側の TCP/IP を右クリックしプロパティーを開きます。&lt;br&gt;&lt;br&gt;SQL Server リモート接続の設定方法 3&lt;br&gt;&lt;br&gt;&lt;br&gt;プロトコルのタブで 「 有効 」 を 「 はい 」 に変更し、IP アドレスのタブの「 TCP ポート 」 のポート番号が SQL Server のデフォルトポートの 1433 になっていることを確認します。&lt;br&gt;&lt;br&gt;SQL Server リモート接続の設定方法 4&lt;br&gt;&lt;br&gt;SQL Server リモート接続の設定方法 5&lt;br&gt;&lt;br&gt;&lt;br&gt;左側の 「 SQL Server のサービス 」 をクリックし、今回設定しているデフォルトインスタンスの SQL Server を選択して右クリックし、再起動しておきます。&lt;br&gt;&lt;br&gt;SQL Server リモート接続の設定方法 6&lt;br&gt;&lt;br&gt;&lt;br&gt;ステップ 3: Windows ファイアウォールを構成する&lt;br&gt;受信の規則で、SQL Server　のデフォルトインスタンスデータベースエンジンの TCP ポートの許可ルールをつくります。&lt;br&gt;&lt;br&gt;スタートメニューの 「 ファイル名を指定して実行 」 で、WF.msc を指定して実行し、 「 セキュリティが強化された Windows ファイアウォール 」 画面を開きます。&lt;br&gt;&lt;br&gt;左側の 「 受信の規則 」 をクリックしてから、右側上の　「 新規の規則 」 をクリックします。&lt;br&gt;&lt;br&gt;SQL Server リモート接続の設定方法 7&lt;br&gt;&lt;br&gt;&lt;br&gt;ウィザードが出てくるので、最初の画面で 「 ポート 」 を選択して 「 次へ 」 をクリックします。&lt;br&gt;&lt;br&gt;SQL Server リモート接続の設定方法 8&lt;br&gt;&lt;br&gt;&lt;br&gt;次の 「 プロトコル及びポート 」 画面で 「 TCP 」 を選択し、ポート番号に 1433 を入力して、「 次へ 」 をクリックします。&lt;br&gt;&lt;br&gt;SQL Server リモート接続の設定方法 9&lt;br&gt;&lt;br&gt;&lt;br&gt;次の 「 操作 」 画面で 「 接続を許可する 」 を選択し、「 次へ 」 をクリックします。&lt;br&gt;&lt;br&gt;SQL Server リモート接続の設定方法 10&lt;br&gt;&lt;br&gt;&lt;br&gt;次の 「 プロファイル 」 画面で 「 ドメイン 」「 プライベート 」「 パブリック 」の 全てにチェックし 「 次へ 」 をクリックします。&lt;br&gt;&lt;br&gt;SQL Server リモート接続の設定方法 11&lt;br&gt;&lt;br&gt;&lt;br&gt;次の 「 名前 」 画面で適当に名前をつけて、「 完了 」 をクリックします。&lt;br&gt;&lt;br&gt;SQL Server リモート接続の設定方法 12&lt;br&gt;&lt;br&gt;&lt;br&gt;これで、SQL Server のデフォルトインスタンス MSSQLSERVER 用の TCP ポートの受信の規則ができました。&lt;br&gt;&lt;br&gt;SQL Server リモート接続の設定方法 13&lt;br&gt;&lt;br&gt;※ 各設定のオプションは必要に応じて変更してください。&lt;br&gt;&lt;br&gt;&lt;br&gt;ステップ 4: クライアント PC から接続してみる&lt;br&gt;クライアント PC にインストールされた SQL Server Management Studio から、設定した SQL Server のデフォルトインスタンス MSSQLSERVER に接続します。&lt;br&gt;&lt;br&gt;SQL Server リモート接続の設定方法 14&lt;br&gt;&lt;br&gt;サーバー名: [データベースサーバーのコンピューター名 か IP アドレス]&lt;br&gt;認証: SQL Server 認証&lt;br&gt;ログイン: [ログインユーザー名]&lt;br&gt;パスワード: [ログインユーザーのパスワード]&lt;br&gt;&lt;br&gt;192.168.0.27 上のデフォルトインスタンス MSSQLSERVER に接続できました。&lt;br&gt;&lt;br&gt;SQL Server リモート接続の設定方法 15&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、SQL Server のデフォルトインスタンスのデータベースエンジンに、リモートで接続するための設定方法についてご説明しました。</description><pubDate>Fri, 12 Feb 2021 21:43:00 GMT</pubDate><category>SQL Server＆T-SQLに関するコラム</category></item>
<item><title>SQL Server Management Studio で複数のテーブルを一括削除する方法</title><link>https://sql55.com/sql-server/how-to-delete-multiple-tables-at-once-using-sql-server-management-studio.php</link><description>SQL Server Management Studio で複数のテーブルを一括削除する方法&lt;br&gt;&lt;br&gt; &lt;br&gt;SQL Server Management Studio で複数のテーブルを一括削除する&lt;br&gt;Excel からデータを SQL Server のデータベースにインポートしたりして、一時的に作ったテーブルをまとめて削除したい時ありませんか？&lt;br&gt;&lt;br&gt;ここでは、SQL Server Management Studio の画面から、複数のテーブルを一括削除する方法をご紹介します。&lt;br&gt;&lt;br&gt;&lt;br&gt;SQL Server Management Studio の普段良く使う [オブジェクトエクスプローラー] からテーブルを削除したい時は、テーブルを選択して右クリックで [削除] しますよね。&lt;br&gt;&lt;br&gt;SQL Server Management Studio で複数のテーブルを一括削除する方法 1&lt;br&gt;&lt;br&gt;&lt;br&gt;ただ、この [オブジェクトエクスプローラー] では、複数のオブジェクトを一度に選択することができないので、複数のテーブルを削除したい時はひとつずつ削除しなければなりません。&lt;br&gt;&lt;br&gt;DROP 文を書けばいいかもしれませんが、SQL Server Management Studio の画面からオブジェクトを一括で削除できれば便利ですよね。&lt;br&gt;&lt;br&gt;そんな時は、[オブジェクト エクスプローラーの詳細] 画面を使うと、SQL Server Management Studio の画面からテーブルなどのオブジェクトを一括で削除することができます。&lt;br&gt;&lt;br&gt;&lt;br&gt;[オブジェクト エクスプローラーの詳細] 画面を表示するには、[表示] メニューの [オブジェクト エクスプローラーの詳細] を選択します。&lt;br&gt;&lt;br&gt;SQL Server Management Studio で複数のテーブルを一括削除する方法 2&lt;br&gt;&lt;br&gt;SQL Server Management Studio で複数のテーブルを一括削除する方法 3&lt;br&gt;&lt;br&gt;&lt;br&gt;テーブルの一覧が表示されていない場合は、[オブジェクトエクスプローラー] 側でデータベースの [テーブル] を選択するか、[オブジェクトエクスプローラーの詳細] のメニューで、オブジェクトをダブルクリックすると子の階層に移動し、[Up] をクリックすると親の階層に移動します。&lt;br&gt;&lt;br&gt;SQL Server Management Studio で複数のテーブルを一括削除する方法 4&lt;br&gt;&lt;br&gt;&lt;br&gt;[オブジェクト エクスプローラーの詳細] 画面では、複数のオブジェクトを一度に選択できるので、削除したいテーブルを選択して右クリックし [削除] を選択します。&lt;br&gt;&lt;br&gt;SQL Server Management Studio で複数のテーブルを一括削除する方法 5&lt;br&gt;&lt;br&gt;&lt;br&gt;削除の確認画面が出てくるので、良ければ [OK] ボタンをクリックすると、削除できる状態であれば、選択したテーブルが削除されます。&lt;br&gt;&lt;br&gt;SQL Server Management Studio で複数のテーブルを一括削除する方法 6&lt;br&gt;&lt;br&gt;テーブルだけでなく、削除可能なオブジェクトは同様の方法で [オブジェクトエクスプローラーの詳細] 画面で複数選択して、一括削除できます。&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、SQL Server Management Studio の画面から、複数のテーブルを一括削除する方法をご紹介しました。</description><pubDate>Sat, 16 Jan 2021 00:36:00 GMT</pubDate><category>Microsoft SQL Server 入門</category></item>
<item><title>外部キー (FOREIGN KEY) と CHECK 制約を無効化(disable) / 有効化(enable) する方法</title><link>https://sql55.com/query/disable-enable-constraints.php</link><description>外部キー (FOREIGN KEY) と CHECK 制約を無効化(disable) / 有効化(enable) する方法&lt;br&gt;&lt;br&gt; &lt;br&gt;外部キー (FOREIGN KEY) と CHECK 制約を無効化(disable) / 有効化(enable) するには？&lt;br&gt;SQL でテーブルにデータを投入したりする際に、一時的に外部キーや CHECK 制約を無効にして、データの投入後、有効にもどしたいような時ありませんか？&lt;br&gt;&lt;br&gt;ここでは、そんな時に使える、外部キー (FOREIGN KEY) と CHECK 制約を無効化・有効化するスクリプトをご紹介します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;あるテーブルの特定の外部キー (FOREIGN KEY) や CHECK 制約を無効化・有効化する方法&lt;br&gt;あるテーブルの全ての外部キー (FOREIGN KEY) と CHECK 制約を無効化・有効化する方法&lt;br&gt;データベースの全ての外部キー (FOREIGN KEY) と CHECK 制約を無効化・有効化する方法&lt;br&gt;あるテーブルの特定の外部キー (FOREIGN KEY) や CHECK 制約を無効化・有効化する方法&lt;br&gt;まずはあるテーブルの、特定の外部キー (FOREIGN KEY) や CHECK 制約を無効化・有効化するスクリプトです。&lt;br&gt;&lt;br&gt;--無効化するスクリプト&lt;br&gt;ALTER TABLE [テーブル名] NOCHECK CONSTRAINT [外部キー・CHECK制約名];&lt;br&gt;&lt;br&gt;--有効化するスクリプト&lt;br&gt;ALTER TABLE [テーブル名] WITH CHECK CHECK CONSTRAINT [外部キー・CHECK制約名];&lt;br&gt;&lt;br&gt;例えば、次のような外部キーとチェック制約のついた TestResult というテーブルがあります。&lt;br&gt;&lt;br&gt;外部キー (FOREIGN KEY) と CHECK 制約を無効化(disable) / 有効化(enable) する方法 1&lt;br&gt;&lt;br&gt;&lt;br&gt;「FK__TestResul__Stude__4E88ABD4」という名前の外部キー制約を無効化したい時は次のようにできます。&lt;br&gt;&lt;br&gt;-- 外部キー制約を無効化&lt;br&gt;ALTER TABLE TestResult NOCHECK CONSTRAINT FK__TestResul__Stude__4E88ABD4;&lt;br&gt;&lt;br&gt;-- ステータス確認のためのスクリプト&lt;br&gt;SELECT  F.name,&lt;br&gt;        F.is_disabled, &lt;br&gt;        F.is_not_trusted&lt;br&gt;FROM    sys.foreign_keys AS F&lt;br&gt;           INNER JOIN sys.objects AS O&lt;br&gt;              ON F.parent_object_id = O.object_id&lt;br&gt;WHERE   O.name = &#039;TestResult&#039;&lt;br&gt;        AND F.name = &#039;FK__TestResul__Stude__4E88ABD4&#039;;&lt;br&gt;外部キー (FOREIGN KEY) と CHECK 制約を無効化(disable) / 有効化(enable) する方法 2&lt;br&gt;&lt;br&gt;「FK__TestResul__Stude__4E88ABD4」外部キー制約の is_disabled カラムの値が 1 になって無効化されているのがわかります。&lt;br&gt;&lt;br&gt;&lt;br&gt;次のスクリプトで外部キー制約を有効化することができます。&lt;br&gt;&lt;br&gt;-- 外部キー制約を有効化&lt;br&gt;ALTER TABLE TestResult WITH CHECK CHECK CONSTRAINT FK__TestResul__Stude__4E88ABD4;&lt;br&gt;&lt;br&gt;-- ステータス確認のためのスクリプト&lt;br&gt;SELECT  F.name,&lt;br&gt;        F.is_disabled, &lt;br&gt;        F.is_not_trusted&lt;br&gt;FROM    sys.foreign_keys AS F&lt;br&gt;           INNER JOIN sys.objects AS O&lt;br&gt;              ON F.parent_object_id = O.object_id&lt;br&gt;WHERE   O.name = &#039;TestResult&#039;&lt;br&gt;        AND F.name = &#039;FK__TestResul__Stude__4E88ABD4&#039;;&lt;br&gt;外部キー (FOREIGN KEY) と CHECK 制約を無効化(disable) / 有効化(enable) する方法 3&lt;br&gt;&lt;br&gt;「FK__TestResul__Stude__4E88ABD4」外部キー制約の is_disabled カラムの値が 0 になって有効化されているのがわかります。&lt;br&gt;&lt;br&gt;CHECK 制約も全く同じ方法で無効化・有効化できます。&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;あるテーブルの全ての外部キー (FOREIGN KEY) と CHECK 制約を無効化・有効化する方法&lt;br&gt;次は、あるテーブルの全ての外部キー (FOREIGN KEY) と CHECK 制約を無効化・有効化する方法です。&lt;br&gt;&lt;br&gt;先ほど、[外部キー・CHECK制約名] を指定していた箇所を ALL に変更すると、指定したテーブルの全ての 外部キー (FOREIGN KEY) と CHECK 制約が無効化・有効化できます。&lt;br&gt;&lt;br&gt;--無効化するスクリプト&lt;br&gt;ALTER TABLE [テーブル名] NOCHECK CONSTRAINT ALL;&lt;br&gt;&lt;br&gt;--有効化するスクリプト&lt;br&gt;ALTER TABLE [テーブル名] WITH CHECK CHECK CONSTRAINT ALL;&lt;br&gt;&lt;br&gt;先ほどの TestResult テーブルの全ての外部キーと CHECK 制約を無効化したい時は次のようにできます。&lt;br&gt;&lt;br&gt;外部キー (FOREIGN KEY) と CHECK 制約を無効化(disable) / 有効化(enable) する方法 1&lt;br&gt;&lt;br&gt;&lt;br&gt;-- 制約を無効化&lt;br&gt;ALTER TABLE TestResult NOCHECK CONSTRAINT ALL;&lt;br&gt;&lt;br&gt;-- ステータス確認のためのスクリプト&lt;br&gt;SELECT  F.name,&lt;br&gt;        F.is_disabled, &lt;br&gt;        F.is_not_trusted&lt;br&gt;FROM    sys.foreign_keys AS F&lt;br&gt;           INNER JOIN sys.objects AS O&lt;br&gt;              ON F.parent_object_id = O.object_id&lt;br&gt;WHERE   O.name = &#039;TestResult&#039;;&lt;br&gt;&lt;br&gt;SELECT  C.name,&lt;br&gt;        C.is_disabled, &lt;br&gt;        C.is_not_trusted&lt;br&gt;FROM    sys.check_constraints AS C&lt;br&gt;            INNER JOIN sys.objects AS O&lt;br&gt;              ON C.parent_object_id = O.object_id&lt;br&gt;WHERE   O.name = &#039;TestResult&#039;;&lt;br&gt;外部キー (FOREIGN KEY) と CHECK 制約を無効化(disable) / 有効化(enable) する方法 4&lt;br&gt;&lt;br&gt;&lt;br&gt;有効化に戻すには次のようにできます。&lt;br&gt;&lt;br&gt;-- 制約を有効化&lt;br&gt;ALTER TABLE TestResult WITH CHECK CHECK CONSTRAINT ALL;&lt;br&gt;&lt;br&gt;-- ステータス確認のためのスクリプト&lt;br&gt;SELECT  F.name,&lt;br&gt;        F.is_disabled, &lt;br&gt;        F.is_not_trusted&lt;br&gt;FROM    sys.foreign_keys AS F&lt;br&gt;           INNER JOIN sys.objects AS O&lt;br&gt;              ON F.parent_object_id = O.object_id&lt;br&gt;WHERE   O.name = &#039;TestResult&#039;;&lt;br&gt;&lt;br&gt;SELECT  C.name,&lt;br&gt;        C.is_disabled, &lt;br&gt;        C.is_not_trusted&lt;br&gt;FROM    sys.check_constraints AS C&lt;br&gt;            INNER JOIN sys.objects AS O&lt;br&gt;              ON C.parent_object_id = O.object_id&lt;br&gt;WHERE   O.name = &#039;TestResult&#039;;&lt;br&gt;外部キー (FOREIGN KEY) と CHECK 制約を無効化(disable) / 有効化(enable) する方法 5&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;データベースの全ての外部キー (FOREIGN KEY) と CHECK 制約を無効化・有効化する方法&lt;br&gt;最後に、データベースの全ての外部キー (FOREIGN KEY) と CHECK 制約を無効化・有効化する方法です。&lt;br&gt;&lt;br&gt;sp_MSForEachTable を使って、先ほどの、あるテーブルの全ての外部キー (FOREIGN KEY) と CHECK 制約を無効化・有効化するスクリプトを全テーブルに対して実行します。&lt;br&gt;&lt;br&gt;sp_MSForEachTable はマイクロソフトによってドキュメントされていないストアドプロシージャで、引数で指定したコマンドを全てのユーザーテーブルについて実行してくれます。&lt;br&gt;&lt;br&gt;--無効化するスクリプト&lt;br&gt;EXEC sp_MSForEachTable &#039;ALTER TABLE ? NOCHECK CONSTRAINT ALL;&#039;&lt;br&gt;&lt;br&gt;--有効化するスクリプト&lt;br&gt;EXEC sp_MSForEachTable &#039;ALTER TABLE ? WITH CHECK CHECK CONSTRAINT ALL;&#039;&lt;br&gt;&lt;br&gt;データベースを選択して、次のスクリプトを実行するとデータベースの全ての外部キー (FOREIGN KEY) と CHECK 制約が無効化されます。&lt;br&gt;&lt;br&gt;-- 制約を無効化&lt;br&gt;EXEC sp_MSForEachTable &#039;ALTER TABLE ? NOCHECK CONSTRAINT ALL;&#039;&lt;br&gt;&lt;br&gt;-- ステータス確認のためのスクリプト&lt;br&gt;SELECT   O.name AS TableName,&lt;br&gt;         F.name,&lt;br&gt;         F.is_disabled, &lt;br&gt;         F.is_not_trusted&lt;br&gt;FROM     sys.foreign_keys AS F&lt;br&gt;            INNER JOIN sys.objects AS O&lt;br&gt;               ON F.parent_object_id = O.object_id;&lt;br&gt;&lt;br&gt;SELECT   O.name AS TableName,&lt;br&gt;         C.name,&lt;br&gt;         C.is_disabled, &lt;br&gt;         C.is_not_trusted&lt;br&gt;FROM     sys.check_constraints AS C&lt;br&gt;            INNER JOIN sys.objects AS O&lt;br&gt;               ON C.parent_object_id = O.object_id;&lt;br&gt;外部キー (FOREIGN KEY) と CHECK 制約を無効化(disable) / 有効化(enable) する方法 6&lt;br&gt;&lt;br&gt;Test 用のデータベースなので、制約の数が少ないですが、TestResult テーブルだけではなく、TestResultSummary というテーブルの制約も無効化されています。&lt;br&gt;&lt;br&gt;&lt;br&gt;次のスクリプトで、データベースの全ての外部キー (FOREIGN KEY) と CHECK 制約が有効化されます。&lt;br&gt;&lt;br&gt;-- 制約を有効化&lt;br&gt;EXEC sp_MSForEachTable &#039;ALTER TABLE ? WITH CHECK CHECK CONSTRAINT ALL;&#039;&lt;br&gt;&lt;br&gt;-- ステータス確認のためのスクリプト&lt;br&gt;SELECT   O.name AS TableName,&lt;br&gt;         F.name,&lt;br&gt;         F.is_disabled, &lt;br&gt;         F.is_not_trusted&lt;br&gt;FROM     sys.foreign_keys AS F&lt;br&gt;            INNER JOIN sys.objects AS O&lt;br&gt;               ON F.parent_object_id = O.object_id;&lt;br&gt;&lt;br&gt;SELECT   O.name AS TableName,&lt;br&gt;         C.name,&lt;br&gt;         C.is_disabled, &lt;br&gt;         C.is_not_trusted&lt;br&gt;FROM     sys.check_constraints AS C&lt;br&gt;            INNER JOIN sys.objects AS O&lt;br&gt;               ON C.parent_object_id = O.object_id;&lt;br&gt;外部キー (FOREIGN KEY) と CHECK 制約を無効化(disable) / 有効化(enable) する方法 7&lt;br&gt;&lt;br&gt;&lt;br&gt;ALL キーワードを使って外部キー (FOREIGN KEY) と CHECK 制約を有効化すると、そのテーブルの全ての外部キー (FOREIGN KEY) と CHECK 制約が有効化されます。&lt;br&gt;&lt;br&gt;一時的に外部キーや CHECK 制約を無効にして、データの投入後、有効にもどしたいような状況の時は、意図的に無効化していた制約まで有効化してしまわないように気をつけてくださいね！&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、外部キー (FOREIGN KEY) と CHECK 制約を、無効化 (disable)・有効化 (enable) するスクリプトをご紹介しました。</description><pubDate>Fri, 08 Jan 2021 04:06:00 GMT</pubDate><category>便利なT-SQL＆クエリー集</category></item>
<item><title>SQL Server インポートおよびエクスポート ウィザード - Excel などの OLEDB プロバイダエラーの解決方法</title><link>https://sql55.com/sql-server/sql-server-import-and-export-wizard-excel-oledb-provider-error.php</link><description>SQL Server インポートおよびエクスポート ウィザード - Excel などの OLEDB プロバイダエラーの解決方法&lt;br&gt;&lt;br&gt; &lt;br&gt;SQL Server Management Studio でデータベースを選択して [タスク] &gt; [データのインポート] などのメニューを選択すると SQL Server インポートおよびエクスポート ウィザード が起動します。&lt;br&gt;&lt;br&gt;ここでは、SQL Server インポートおよびエクスポート ウィザードで、データソースなどに Excel や Access ファイル等を指定した時に、次のような OLEDB プロバイダエラーが出た際の解決方法のひとつをご紹介します。&lt;br&gt;&lt;br&gt;&lt;br&gt;&#039;Microsoft.ACE.OLEDB.12.0&#039; プロバイダはローカルのコンピュータに登録されていません。 (System.Data)&lt;br&gt;&lt;br&gt;The &#039;Microsoft.ACE.OLEDB.12.0&#039; provider is not registered on the local machine. (System.Data)&lt;br&gt;&lt;br&gt;SQL Server インポートおよびエクスポート ウィザード - プロバイダエラーの解決方法 1&lt;br&gt;&lt;br&gt;目次&lt;br&gt;OLEDB プロバイダエラーの原因と解決方法について&lt;br&gt;64 bit 版の SQL Server インポートおよびエクスポート ウィザードの起動方法&lt;br&gt;OLEDB プロバイダエラーの原因と解決方法について&lt;br&gt;この状況で「&#039;Microsoft.ACE.OLEDB.12.0&#039; プロバイダはローカルのコンピュータに登録されていません。」エラーが起こる原因は、マシンに 32 bit バージョンの OLEDB プロバイダがインストールされていない為です。&lt;br&gt;&lt;br&gt;SQL Server Management Studio (SSMS) が 32 bit のアプリケーションなので、SSMS から SQL Server インポートおよびエクスポート ウィザードを起動すると 32 bit バージョンのウィザードが起動されるからです。&lt;br&gt;&lt;br&gt;32 bit の OLEDB プロバイダが登録されていなくても、64 bit のプロバイダはインストールされている場合は 64-bit の SQL Server インポートおよびエクスポート ウィザードを使用することが解決できます。&lt;br&gt;&lt;br&gt;&lt;br&gt;64 bit 版の SQL Server インポートおよびエクスポート ウィザードの起動方法&lt;br&gt;64 bit 版の SQL Server インポートおよびエクスポート ウィザードの起動する方法は何通りかあります。&lt;br&gt;&lt;br&gt;簡単な方法は、SQL Server がインストールされている Windows のスタートメニューから Microsoft SQL Server を探し、[SQL Server * データのインポートおよびエクスポート (64 ビット)] を選択します。&lt;br&gt;&lt;br&gt;SQL Server インポートおよびエクスポート ウィザード - プロバイダエラーの解決方法 2&lt;br&gt;&lt;br&gt;&lt;br&gt;または、SQL Server がインストールされている Windows の検索機能で 「Import Data（データのインポート）」などで検索すると出てきます。&lt;br&gt;&lt;br&gt;SQL Server インポートおよびエクスポート ウィザード - プロバイダエラーの解決方法 3&lt;br&gt;&lt;br&gt;&lt;br&gt;起動されるファイルは C:\Program Files\Microsoft SQL Server\[バージョンごとの番号]\DTS\Binn にある DTSWizard.exe ファイルで、このファイルを直接起動しても大丈夫です。&lt;br&gt;&lt;br&gt;[バージョンごとの番号] は COMPATIBILITY_LEVEL と同じで、2017 は 140、2019 は 150 です。&lt;br&gt;&lt;br&gt;SQL Server インポートおよびエクスポート ウィザード - プロバイダエラーの解決方法 4&lt;br&gt;&lt;br&gt;&lt;br&gt;上記の方法で、64 bit 版の SQL Server インポートおよびエクスポート ウィザードを起動して実行すると、64 bit 版の該当の OLEDB プロバイダがインストールされている場合はエラーが出なくなるはずです。&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、SQL Server インポートおよびエクスポート ウィザード の Excel などの OLEDB プロバイダエラーの解決方法のひとつをご紹介しました。</description><pubDate>Thu, 07 Jan 2021 02:01:00 GMT</pubDate><category>Microsoft SQL Server 入門</category></item>
<item><title>SQL Server - 認証モードの変更方法</title><link>https://sql55.com/sql-server/how-to-change-sql-server-authentication-mode.php</link><description>SQL Server - 認証モードの変更方法&lt;br&gt;&lt;br&gt; &lt;br&gt;ここでは、SQL Server でユーザー名とパスワードでログインできるように認証モードを変更する方法をご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;SQL Server の接続の認証モードとは？&lt;br&gt;SQL Server の接続の認証モードを変更する&lt;br&gt;sa アカウントのログインを有効化する&lt;br&gt;SQL Server Management Studio から sa アカウントでログインする&lt;br&gt;SQL Server の接続の認証モードとは？&lt;br&gt;SQL Server へ接続する時の認証モードには、[Windows 認証モード] と [SQL Server 認証モードと Windows 認証モード] があります。&lt;br&gt;&lt;br&gt;[Windows 認証モード] は Windows のユーザアカウントを使って認証する方法で、Windows へログインした時のトークンを使って認証する方法です。 この方法では SQL Server 接続時にユーザー名とパスワードは入力しません。&lt;br&gt;&lt;br&gt;[SQL Server 認証モード] は Windows のユーザーではなく、SQL Server のユーザーを使用し、ユーザー名とパスワードを入力してログインする方法です。&lt;br&gt;&lt;br&gt;&lt;br&gt;「 基本 」オプションで SQL Server をインストールすると、デフォルトではユーザ名とパスワードでログインする 「SQL Server 認証モード」 はオフになっていて、ユーザ名とパスワードでは SQL Server に接続できません。&lt;br&gt;&lt;br&gt;この記事では [Windows 認証モード] になっている前提で、SQL Server Management Studio (SSMS) で、SQL Server にユーザ名とパスワードで接続できるように、[SQL Server 認証モードと Windows 認証モード] に変更する方法をご説明します。&lt;br&gt;&lt;br&gt;今回は sa アカウントで接続できるようにするところまで、順を追ってご説明します。&lt;br&gt;&lt;br&gt;&lt;br&gt;SQL Server の接続の認証モードを変更する&lt;br&gt;SQL Server Management Studio (SSMS) を起動し、認証モードを変更したい SQL Server に接続します。&lt;br&gt;&lt;br&gt;接続方法がわからない方は 「SQL Server Management Studio (SSMS) でデータベースに接続する」 をご覧ください。&lt;br&gt;&lt;br&gt;&lt;br&gt;オブジェクトエクスプローラで、SQL Server サーバーを選択し右クリックして [プロパティ] を選択します。&lt;br&gt;&lt;br&gt;SQL Server - 認証モードの変更方法 1&lt;br&gt;&lt;br&gt;&lt;br&gt;プロパティ画面が出てくるので、左側のページで [セキュリティ] を選択し、「サーバー認証」の項目で、[Windows 認証モード] から [SQL Server 認証モードと Windows 認証モード] に変更し、[OK] ボタンをクリックします。&lt;br&gt;&lt;br&gt;SQL Server - 認証モードの変更方法 2&lt;br&gt;&lt;br&gt;再起動が必要であることを示すダイアログボックスでが出てくるので、[OK] ボタンをクリックします。&lt;br&gt;&lt;br&gt;&lt;br&gt;オブジェクトエクスプローラに戻り、再度 SQL Server サーバーを右クリックして [再起動] します。&lt;br&gt;&lt;br&gt;SQL Server - 認証モードの変更方法 9&lt;br&gt;&lt;br&gt;これで、SQL Server の認証モードが変更できました。&lt;br&gt;&lt;br&gt;&lt;br&gt;sa アカウントのログインを有効化する&lt;br&gt;今回は sa アカウントを使って、SQL Server に SQL 認証でログインしてみます。&lt;br&gt;&lt;br&gt; sa アカウントというのは組み込みの SQL Server システム管理者アカウントです。&lt;br&gt;&lt;br&gt;sa アカウントでログインすると何でもできる権限があるので、特に本番環境でアプリケーションプログラムから接続する時は sa アカウント以外のユーザを使ったほうが良いと思います。&lt;br&gt;&lt;br&gt;マイクロソフトでも、アプリケーションに必要がない限り sa アカウントは無効化することが推奨されています。&lt;br&gt;&lt;br&gt;ただ、権限が原因でエラーになることがないので、学習に使ったり、機能を試したりする時には便利です。 sa アカウントでできて、他のユーザでできない場合は権限の設定を見直してみてください。&lt;br&gt;&lt;br&gt;「 基本 」オプションで SQL Server をインストールすると、sa アカウントのログインが無効化されていることがありますので、sa アカウントのログインを有効化します。&lt;br&gt;&lt;br&gt;&lt;br&gt;SQL Server Management Studio のオブジェクトエクスプローラで、[セキュリティ] &gt; [ログイン] を開き、sa を選択して右クリックし、[プロパティ] を選択します。&lt;br&gt;&lt;br&gt;SQL Server - 認証モードの変更方法 3&lt;br&gt;&lt;br&gt;&lt;br&gt;プロパティ画面が出てくるので、左側のページで [状態] を選択し、「ログイン」の項目で、無効になっている場合は [有効] に変更します。&lt;br&gt;&lt;br&gt;SQL Server - 認証モードの変更方法 4&lt;br&gt;&lt;br&gt;&lt;br&gt;sa のパスワードがわからない方は、[全般] ページの以下の場所でパスワードを再設定して、[OK] ボタンをクリックします。&lt;br&gt;&lt;br&gt;SQL Server - 認証モードの変更方法 5&lt;br&gt;&lt;br&gt;&lt;br&gt;SQL Server Management Studio から sa アカウントでログインする&lt;br&gt;それでは、SQL Server 認証で SQL Server に接続してみましょう。&lt;br&gt;&lt;br&gt;[サーバーへの接続] 画面の「認証」で [SQL Server 認証] を選択します。&lt;br&gt;&lt;br&gt;SQL Server - 認証モードの変更方法 6&lt;br&gt;&lt;br&gt;&lt;br&gt;Login に sa と入力し、Password に sa のパスワードを入力して、[接続] ボタンをクリックします。&lt;br&gt;&lt;br&gt;SQL Server - 認証モードの変更方法 7&lt;br&gt;&lt;br&gt;&lt;br&gt;これで、SQL Server 認証で、sa アカウントで SQL Server に接続できました。&lt;br&gt;&lt;br&gt;SQL Server - 認証モードの変更方法 9&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、SQL Server でユーザー名とパスワードでログインできるように認証モードを変更する方法をご説明しました。</description><pubDate>Fri, 16 Oct 2020 21:47:00 GMT</pubDate><category>Microsoft SQL Server 入門</category></item>
<item><title>SQL Server - BIT の反転させた値を取得する方法</title><link>https://sql55.com/query/how-to-negate-bit-value.php</link><description>SQL Server - BIT の反転させた値を取得する方法&lt;br&gt;&lt;br&gt; &lt;br&gt;BIT の反転させた（反対の）値を取得する方法&lt;br&gt;BIT のデータ型に入っている値を反転させたい時ありますよね。&lt;br&gt;&lt;br&gt;例えば CloseFlag という BIT 型のカラムに、その期間がクローズされたかどうかを表す値が入っていて、クライアントのプログラムではその期間がオープンかどうかをチェックボックスで表示したいような時です。&lt;br&gt;&lt;br&gt;今回はそんな時に簡単に BIT の値を反転させる方法をご紹介します。&lt;br&gt;&lt;br&gt;&lt;br&gt;~ (ビット演算子 NOT) を使って BIT の値を反転させる&lt;br&gt;SQL Server で、BIT の値を反転させたい時には、~ (ビット演算子 NOT) が使えます。&lt;br&gt;&lt;br&gt;カラム名や変数の前に ~ をつけるだけです。&lt;br&gt;&lt;br&gt;&lt;br&gt;BIT 型の変数に入っている 1, 0, null を反転させてみます。&lt;br&gt;&lt;br&gt;DECLARE @CloseFlag1 BIT = 1,&lt;br&gt;        @CloseFlag2 BIT = 0,&lt;br&gt;        @CloseFlag3 BIT;&lt;br&gt;&lt;br&gt;SELECT	~@CloseFlag1 AS OpenFlag1,&lt;br&gt;        ~@CloseFlag2 AS OpenFlag2,&lt;br&gt;        ~@CloseFlag3 AS OpenFlag3;&lt;br&gt;SQL Server - BIT の反転させた値を取得する方法 1&lt;br&gt;&lt;br&gt;1 と 0 の BIT の値が反転していますね。&lt;br&gt;&lt;br&gt;値が NULL の時は反転させても NULL のままですので、NULL を 0 として扱いたいような時は ISNULL() などで変換する前に置き換えてください。&lt;br&gt;&lt;br&gt;&lt;br&gt;CASE 文を使って BIT の値を反転させる&lt;br&gt;ビット演算子のほうが簡単ですが、CASE 文を使っても、BIT の反対の値を取得することができます。&lt;br&gt;&lt;br&gt;DECLARE @CloseFlag1 BIT = 1;&lt;br&gt;&lt;br&gt;SELECT	CASE &lt;br&gt;          WHEN @CloseFlag1 = 1&lt;br&gt;            THEN 0&lt;br&gt;            ELSE 1&lt;br&gt;        END AS OpenFlag1;&lt;br&gt;SQL Server - BIT の反転させた値を取得する方法 2&lt;br&gt;&lt;br&gt;BIT の値は反転されていますね。この方法だと元の値が null の時は、反転した値が 1 になりますね。&lt;br&gt;&lt;br&gt;&lt;br&gt;あと、このやり方だと OpenFlag1 のデータ型は INT になります。&lt;br&gt;&lt;br&gt;SQL_VARIANT_PROPERTY() を使って確認してみましょう。&lt;br&gt;&lt;br&gt; SQL_VARIANT_PROPERTY() の使い方についてはこちらをご覧ください。「SQL Server: 値のデータ型を確認する方法」&lt;br&gt;DECLARE @CloseFlag1 BIT = 1;&lt;br&gt;&lt;br&gt;SELECT SQL_VARIANT_PROPERTY(~@CloseFlag1, &#039;BaseType&#039;);&lt;br&gt;&lt;br&gt;SELECT SQL_VARIANT_PROPERTY(CASE &lt;br&gt;                              WHEN @CloseFlag1 = 1&lt;br&gt;                                THEN 0&lt;br&gt;                                ELSE 1&lt;br&gt;                            END, &#039;BaseType&#039;);&lt;br&gt;SQL Server - BIT の反転させた値を取得する方法 3&lt;br&gt;&lt;br&gt;~ (ビット演算子 NOT)で反転させたほうは bit 型ですが、0, 1 と CASE 文で数字を指定しただけのときは INT 型になっていますね。&lt;br&gt;&lt;br&gt;反転した値を BIT 型で取得したい時は、BIT 型に CAST してください。&lt;br&gt;&lt;br&gt;DECLARE @CloseFlag1 BIT = 1;&lt;br&gt;&lt;br&gt;SELECT	CASE &lt;br&gt;          WHEN @CloseFlag1 = 1&lt;br&gt;            THEN CAST(0 AS BIT)&lt;br&gt;            ELSE CAST(1 AS BIT)&lt;br&gt;        END AS OpenFlag1;&lt;br&gt;以上、SQL Server で BIT の反転させた値を取得する方法をご紹介しました。</description><pubDate>Fri, 31 Jul 2020 01:06:00 GMT</pubDate><category>便利なT-SQL＆クエリー集</category></item>
<item><title>sp_executesql で OUTPUT を取得する</title><link>https://sql55.com/query/how-to-get-output-from-sp-executesql.php</link><description>sp_executesql で OUTPUT を取得する&lt;br&gt;&lt;br&gt; &lt;br&gt;sp_executesql で OUTPUT を取得する&lt;br&gt;SQL Server で動的に作成したスクリプトを実行したい時には システムストアードプロシージャの sp_executesql や EXEC (EXECUTE) ステートメント使って実行することができます。&lt;br&gt;&lt;br&gt;ここでは、sp_executesql を使って、OUTPUT パラメーターの値や、結果セットを取得する方法をご紹介します。&lt;br&gt;&lt;br&gt;&lt;br&gt;sp_executesql で OUTPUT パラメーターの値を取得する&lt;br&gt;sp_executesql システムストアードプロシージャで動的に作成したスクリプトを実行した際に、OUTPUT パラメーターを指定して値を取得することができます。&lt;br&gt;&lt;br&gt;例えば、次のような Student テーブルがあります。&lt;br&gt;&lt;br&gt;sp_executesql で OUTPUT パラメーターの値を取得する 1&lt;br&gt;&lt;br&gt;&lt;br&gt;Student テーブルの中の Gender が &#039;M&#039; のレコード数を sp_executesql を使って OUTPUT パラメーターで取得したい時には、次のようにできます。&lt;br&gt;&lt;br&gt;DECLARE @Sql NVARCHAR(500),&lt;br&gt;        @RecordCount INT;&lt;br&gt;&lt;br&gt;SET @Sql = N&#039;SET @RecordCount = ISNULL((SELECT COUNT(*)&lt;br&gt;                                        FROM   Student&lt;br&gt;                                        WHERE  Gender = @Gender), 0);&#039;;&lt;br&gt;&lt;br&gt;EXEC sp_executesql　@Sql,&lt;br&gt;                  　N&#039;@Gender CHAR(1), @RecordCount INT OUTPUT&#039;, &lt;br&gt;                  　@Gender = &#039;M&#039;,&lt;br&gt;                  　@RecordCount = @RecordCount OUTPUT;&lt;br&gt; &lt;br&gt;SELECT @RecordCount AS RecordCount;&lt;br&gt;sp_executesql で OUTPUT パラメーターの値を取得する 2&lt;br&gt;&lt;br&gt;このように、パラメーターの定義の箇所と、パラメータの値を指定する箇所に 出力パラメータであることを示すために OUTPUT キーワードを追加します。&lt;br&gt;&lt;br&gt;Gender = &#039;M&#039; のレコードは 3 つなので、@RecordCount に 3 が入っていますね。&lt;br&gt;&lt;br&gt;&lt;br&gt;sp_executesql で結果セットを取得する&lt;br&gt;sp_executesql を使って、Gender = &#039;M&#039; のレコードの数ではなくて、Gender = &#039;M&#039; のレコードを結果セットとして取得することもできます。&lt;br&gt;&lt;br&gt;その際は、先に結果セットが保持できる構造を持つテーブル変数を作っておく必要があります。 例えば次のような感じです。&lt;br&gt;&lt;br&gt;DECLARE @MaleStudent TABLE (&lt;br&gt;	StudentID INT,&lt;br&gt;	FirstName NVARCHAR(50),&lt;br&gt;	LastName NVARCHAR(50),&lt;br&gt;	Gender CHAR(1)&lt;br&gt;);&lt;br&gt;&lt;br&gt;DECLARE @Sql NVARCHAR(500);&lt;br&gt;&lt;br&gt;SET @Sql = N&#039;SELECT StudentID,&lt;br&gt;                    FirstName,&lt;br&gt;                    LastName,&lt;br&gt;                    Gender&lt;br&gt;             FROM   Student&lt;br&gt;             WHERE  Gender = @Gender;&#039;;&lt;br&gt;&lt;br&gt;INSERT INTO @MaleStudent&lt;br&gt;  EXEC sp_executesql @Sql,&lt;br&gt;                     N&#039;@Gender CHAR(1)&#039;, &lt;br&gt;                     @Gender = &#039;M&#039;;&lt;br&gt; &lt;br&gt;SELECT * FROM @MaleStudent;&lt;br&gt;sp_executesql で OUTPUT パラメーターの値を取得する 3&lt;br&gt;&lt;br&gt;「 INSERT INTO テーブル変数 EXEC sp_executesql ... 」のようにして、結果セットをテーブル変数に挿入します。&lt;br&gt;&lt;br&gt;Student テーブルの Gender = &#039;M&#039; のレコードが @MaleStudent に取得できていますね。&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、sp_executesql を使って、OUTPUT パラメーターの値や、結果セットを取得する方法をご紹介しました。&lt;br&gt;</description><pubDate>Thu, 02 Jul 2020 23:46:00 GMT</pubDate><category>便利なT-SQL＆クエリー集</category></item>
<item><title>Azure SQL Database とは？</title><link>https://sql55.com/azure-sql-database/what-is-azure-sql-database.php</link><description>Azure SQL Database とは？&lt;br&gt;&lt;br&gt; &lt;br&gt;Azure SQL Database とは？&lt;br&gt;最近はどんどん、システムのクラウド化が進んでいますね。&lt;br&gt;&lt;br&gt;私の働いている会社でも、サーバーのアップグレードのタイミングで、オンプレミスからクラウドへの移行するクライアントが多いです。&lt;br&gt;&lt;br&gt;今回はクラウドデータベースサービスの Azure SQL Database について、簡単にご紹介します。&lt;br&gt;&lt;br&gt;Azure&lt;br&gt;&lt;br&gt;&lt;br&gt;Azure SQL Database とは？&lt;br&gt;Azure SQL Database は 2010 年にリリースされた Microsoft のクラウド版のデータベースサービスです。&lt;br&gt;&lt;br&gt;最新版の Enterprise エディションの SQL Server エンジンが提供されているので、オンプレミスの同じバージョン・エディションの SQL Server エンジンとほぼ同様の機能がそのまま使えます。&lt;br&gt;&lt;br&gt;オンプレミスと比べて、特に良い点としては、スケーラビリティ (scalability) や 高可用性 (high availability) があげられます。&lt;br&gt;&lt;br&gt;マイクロソフトののサイトでは 99.99% の可用性と記載されています。&lt;br&gt;&lt;br&gt;また、ビルトインでバックアップ、パッチのインストール、リカバリーがサポートされています。&lt;br&gt;&lt;br&gt;使い始めるのもとても簡単ですし、今 Microsoft SQL Server を使っている人であれば、なんの抵抗もなく Azure SQL Database を使えると思います。&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;Azure SQL Database デプロイオプションについて&lt;br&gt;Azure SQL Database には 3 つのデプロイオプションが用意されています。&lt;br&gt;Single database オプション&lt;br&gt;Single データベースのデプロイメントオプションは SQL Server エンジンのデータベースをひとつと、割り当てられたリソースが使えるオプションです。&lt;br&gt;&lt;br&gt;新規にアプリケーションを開発する時におすすめされています。&lt;br&gt;&lt;br&gt;一部の T-SQL ステートメントやクエリーは制限されていて、サーバーレベルの T-SQL ステートメントなどは使えません。&lt;br&gt;&lt;br&gt;料金体系はフレキシブルで、一番安いプランからはじめて、必要に応じてダウンタイムなしでプランを変更することができます。&lt;br&gt;&lt;br&gt;Elastic pool オプション&lt;br&gt;Elastic pool は複数のデータベースが必要な時に、同じ Azure SQL Database サーバに作り、リソースなどをシェアして利用したい時に使えるオプションです。&lt;br&gt;&lt;br&gt;複数のデータベースが必要になった時に Single データベースオプションから Elastic pool に移行することができます。&lt;br&gt;&lt;br&gt;その他の利点などは Single データベースデプロイメントオプションと同じです。&lt;br&gt;&lt;br&gt;Managed instance オプション&lt;br&gt;3 つのオプションの中で一番料金が高いですが、オンプレミスの最新版のエンタープライズエディションの SQL Server エンジンとほぼ 100% の互換性があります。&lt;br&gt;&lt;br&gt;SQL Server を使うシステムの変更を最小限にして、既存のオンプレミスの SQL Server をクラウドに持ってくるののに適したオプションとされています。&lt;br&gt;&lt;br&gt;Azure Database Migration Service という移行のためのサービスまで用意されており、オンプレミスの SQL Server インスタンスから Azure SQL Database のマネージドインスタンスへのデータベースの移行をスムースに行うことができます。&lt;br&gt;&lt;br&gt;&lt;br&gt;オンプレミスの SQL Server をクラウドに移行するもうひとつのオプション&lt;br&gt;オンプレミスの SQL Serverをクラウドに移行するには、Managed instance がおすすめされていますが、Azure SQL Database とは別に、SQL Server を Azure のバーチャルマシン上にインストールするというオプションがあります。&lt;br&gt;&lt;br&gt;一番コストがかかりますが、この方法ですと OS のバージョンや、SQL Server のバージョンやエディションなど、自由に選択できます。&lt;br&gt;&lt;br&gt;また、OS や SQL Server の管理者権限が必要となるような設定も自由に設定可能です。 オンプレミスで管理するのとほぼ同じです。&lt;br&gt;&lt;br&gt;本当にシステムの変更を最低限にして、クラウドに移行したいのであれば、この方法が一番良いと思います。&lt;br&gt;&lt;br&gt;SQL Server のバージョンやエディションを指定したい時はこの方法しかないとも言えますね。&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、Azure SQL Database とは何かについてご説明しました。</description><pubDate>Mon, 27 Apr 2020 23:27:00 GMT</pubDate><category>Azure SQL Database 入門</category></item>
<item><title>Azure SQL Database 入門</title><link>https://sql55.com/azure-sql-database/</link><description>Azure SQL Database は Microsoft のクラウド版のデータベースサービスです。&lt;br&gt;&lt;br&gt;システムのクラウド化が進んでいるので、Azure SQL Database について、Microsoft SQL Database を使われている方々に有用な情報を、できるだけわかりやすくご説明したいと思います。&lt;br&gt;&lt;br&gt;Azure SQL Database とは？</description><pubDate>Mon, 27 Apr 2020 23:25:00 GMT</pubDate><category>Azure SQL Database 入門</category></item>
<item><title>SQL Server Management Studio でバックアップなどのスクリプトを生成する方法</title><link>https://sql55.com/sql-server/how-to-generate-backup-script-using-ssms.php</link><description>SQL Server Management Studio でバックアップなどのスクリプトを生成する方法&lt;br&gt;&lt;br&gt; &lt;br&gt;SSMS の画面からバックアップなどのスクリプトを生成する&lt;br&gt;SQL Server Management Studio の GUI を使って、データベースのバックアップをとる時に、毎回同じオプションを選択して、ちょっと面倒だなと思うような時ありませんか？&lt;br&gt;&lt;br&gt;同じことができるバックアップのスクリプトがあったら、クエリー画面を開いて、実行すれば良いだけなので便利ですよね。&lt;br&gt;&lt;br&gt;今回は、SQL Server Management Studio の画面から、バックアップなどのスクリプトを生成する方法をご紹介します。&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;バックアップのスクリプトを生成する方法&lt;br&gt;SQL Server Management Studio の画面から、データベース完全バックアップのオプションを設定した後で、バックアップスクリプトを生成してみましょう。&lt;br&gt;&lt;br&gt;今回は適当にバックアップのオプションを設定していきますが、実際バックアップをとる際はこの通りでなくても全然大丈夫です。&lt;br&gt;&lt;br&gt; ここでは、スクリプトの生成方法についてご説明しますので、データベースの完全バックアップをとる方法の詳細は「SQL Server: フル（完全）バックアップをとる方法」をご覧ください。&lt;br&gt;&lt;br&gt;1. まず、バックアップしたいデータベースを選択して右クリックし、 [タスク] &gt; [バックアップ] を選択します。&lt;br&gt;&lt;br&gt;SSMS バックアップのスクリプトを生成する方法 1&lt;br&gt;&lt;br&gt;&lt;br&gt;2. データベースのバックアップの画面が出てくるので、[全般] のページで「コピーのみのバックアップ」をチェックし、バックアップ先を追加します。&lt;br&gt;&lt;br&gt;SSMS バックアップのスクリプトを生成する方法 2&lt;br&gt;&lt;br&gt;&lt;br&gt;3. [メディアオプション] のページでは、「既存のすべてのバックアップセットを上書きする」を選択します。&lt;br&gt;&lt;br&gt;SSMS バックアップのスクリプトを生成する方法 3&lt;br&gt;&lt;br&gt;&lt;br&gt;4. [バックアップオプション] のページでは、圧縮のオプションで「バックアップを圧縮する」を選択します。&lt;br&gt;&lt;br&gt;SSMS バックアップのスクリプトを生成する方法 4&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;5. これでバックアップの希望の設定が終わったので、スクリプトを生成します。&lt;br&gt;&lt;br&gt;設定画面の上のほうにある[スクリプト] をクリックし、「スクリプト操作を新規クエリ ウィンドウに保存」を選択します。&lt;br&gt;&lt;br&gt;今回はすぐ実行するので、新規クエリウィンドウに保存を選択しますが、ファイルに保存、クリップボードに保存、ジョブに保存など、ご希望に応じて選択してください。&lt;br&gt;&lt;br&gt;ちなみに、スクリプト操作をジョブに保存するオプションを選択すると、ステップ１のコマンドにバックアップのスクリプトが設定された状態で、新規のジョブ作成画面が立ち上がります。&lt;br&gt;&lt;br&gt;SSMS バックアップのスクリプトを生成する方法 5&lt;br&gt;&lt;br&gt;&lt;br&gt;6. 新規クエリウインドウが開き、指定したデータベースをバックアップするスクリプトが出力されます。&lt;br&gt;&lt;br&gt;BACKUP DATABASE [Test] TO  &lt;br&gt;	DISK = N&#039;C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\Backup\Test.bak&#039; &lt;br&gt;	WITH  COPY_ONLY, NOFORMAT, INIT,  NAME = N&#039;Test-Full Database Backup&#039;, &lt;br&gt;	SKIP, NOREWIND, NOUNLOAD, COMPRESSION,  STATS = 10&lt;br&gt;GO&lt;br&gt;SSMS バックアップのスクリプトを生成する方法 6&lt;br&gt;&lt;br&gt;COPY_ONLY、INIT、COMPRESSION など画面から設定したオプションが反映されていますね。&lt;br&gt;&lt;br&gt;&lt;br&gt;このスクリプトを実行してみると、ちゃんとバックアップファイルが指定のフォルダーに生成されました。&lt;br&gt;&lt;br&gt;SSMS バックアップのスクリプトを生成する方法 7&lt;br&gt;&lt;br&gt;SSMS バックアップのスクリプトを生成する方法 8&lt;br&gt;&lt;br&gt;&lt;br&gt;最後に、このスクリプトを生成する方法はバックアップの時だけでなく、データベースの圧縮や復元、ログイン、ユーザー、データベース、ジョブの生成などなど、SQL Server Management Studio の画面にスクリプトボタンがある場合は同様にスクリプトを生成することができます。&lt;br&gt;&lt;br&gt;スクリプトがあったほうが便利な時もあると思うので、活用してみてくださいね。&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、SQL Server Management Studio でバックアップなどのスクリプトを生成する方法をご紹介しました。</description><pubDate>Fri, 27 Mar 2020 21:09:00 GMT</pubDate><category>Microsoft SQL Server 入門</category></item>
<item><title>SQL Server の sysname 型とは？</title><link>https://sql55.com/column/sql-server-what-is-sysname-data-type.php</link><description>SQL Server の sysname 型とは？&lt;br&gt;&lt;br&gt; &lt;br&gt;SQL Server の sysname 型とは？&lt;br&gt;sys.objects などのシステムカタログビューの定義を見ていると、列のデータ型が sysname となっていることがあります。&lt;br&gt;&lt;br&gt;SQL Server の sysname 型とは 1&lt;br&gt;&lt;br&gt;sysname 型はユーザー定義のテーブルにはほとんど使わない、あまり馴染みのないデータ型だと思います。&lt;br&gt;&lt;br&gt;今回は、SQL　Server の sysname 型とは何か？についてご紹介します。&lt;br&gt;&lt;br&gt;&lt;br&gt;sysname 型とは？&lt;br&gt;sysname 型は、SQL Server で使用できる特殊なデータ型のひとつで、データベースのオブジェクト名を格納するのに使われます。&lt;br&gt;&lt;br&gt;機能的には sysname 型を使ってカラムを定義してみるとわかりますが、SQL Server 7.0 以降のバージョンでは nvarchar(128) NOT NULL と同じです。&lt;br&gt;&lt;br&gt;SQL Server の sysname 型とは 3&lt;br&gt;&lt;br&gt;SQL Server の sysname 型とは 2&lt;br&gt;&lt;br&gt;1996 年のリリースなのでもう使われていないかもしれませんが、SQL Server 6.5 以前は varchar(30) と同等です。&lt;br&gt;&lt;br&gt;ちなみに、SQL Server 2008 R2 以前はケースセンシティブのコレーションでは、sysname のキーワードは小文字でないと認識しませんでしたが、今は小文字でも大文字でも大丈夫です。&lt;br&gt;&lt;br&gt;&lt;br&gt;sysname 型はどんな時に使う？&lt;br&gt;では、sysname 型はどんな時に使うと良いでしょうか？&lt;br&gt;&lt;br&gt;あまりユーザー定義のオブジェクトでは使う機会がないというのが正直なところですが、データベースのオブジェクト名を格納することがあって、この先 SQL Server のバージョンをアップグレードする可能性があるような時は sysname 型を使っておくと良いかもしれません。&lt;br&gt;&lt;br&gt;そうしておけば、もしこの先のバージョンの SQL Server で sysname 型が nvarchar(256) NOT NULL などになっても、定義やスクリプト等を変更しなくてもそのまま使えますね。</description><pubDate>Thu, 12 Mar 2020 22:30:00 GMT</pubDate><category>SQL Server＆T-SQLに関するコラム</category></item>
<item><title>SQL SERVER - MERGE でテーブルのデータを同期する</title><link>https://sql55.com/query/sql-server-synchronize-two-tables-using-merge.php</link><description>SQL SERVER - MERGE でテーブルのデータを同期する&lt;br&gt;&lt;br&gt; &lt;br&gt;MERGE 文を使ってテーブルのデータを同期する&lt;br&gt;同じような構造の二つのテーブルがあって、そのデータを同期したいような時ありませんか？&lt;br&gt;&lt;br&gt;具体的には次のような処理をしたい時です。　&lt;br&gt;&lt;br&gt;変更元となるテーブルをソーステーブル、変更先のテーブルをターゲットテーブルとして、&lt;br&gt;&lt;br&gt;ソーステーブルのデータがターゲットテーブルに存在する時は UPDATE&lt;br&gt;ソーステーブルのデータがターゲットテーブルに存在しない時は INSERT&lt;br&gt;ターゲットテーブルにしか存在しない時は DELETE&lt;br&gt;これらの処理を行うことによって、ターゲットテーブルのデータはソーステーブルのデータと同じなるはずです。&lt;br&gt;&lt;br&gt;&lt;br&gt;MERGE 文を使うと、この UPDATE、INSERT、DELETE の処理を一度に行うことができます。&lt;br&gt;&lt;br&gt;今回は簡単な MERGE 文を使ってテーブルのデータを同期する方法をご紹介します。&lt;br&gt;&lt;br&gt;&lt;br&gt;MERGE 文で同時に挿入・更新・削除を行う&lt;br&gt;今回使う、シンプルな MERGE ステートメントの構文は次の通りです。&lt;br&gt;&lt;br&gt;MERGE &lt;target_table&gt;&lt;br&gt;USING &lt;table_source&gt;&lt;br&gt;ON &lt;merge_search_condition&gt;  &lt;br&gt;WHEN MATCHED &lt;br&gt;　　　THEN &lt;merge_matched&gt;&lt;br&gt;WHEN NOT MATCHED BY TARGET&lt;br&gt;　　　THEN &lt;merge_not_matched_by_target&gt;&lt;br&gt;WHEN NOT MATCHED BY SOURCE&lt;br&gt;　　　THEN &lt;merge_not_matched_by_source&gt;; &lt;br&gt;&lt;target_table&gt;: ターゲット（変更先）のテーブル&lt;br&gt;&lt;table_source&gt;: ソース（変更元）のテーブル&lt;br&gt;&lt;merge_search_condition&gt;: マージの結合条件&lt;br&gt;&lt;merge_matched&gt;: ソーステーブルのデータがターゲットテーブルに存在する時に実行される句&lt;br&gt;&lt;merge_not_matched_by_target&gt;: ソーステーブルのデータがターゲットテーブルに存在しない時に実行される句&lt;br&gt;&lt;merge_not_matched_by_source&gt;: ターゲットテーブルにしか存在しない時に実行される句&lt;br&gt;他にもオプションや条件の追加、結果の出力などいろいろありますので、興味のある方はマイクロソフトの MERGE (Transact-SQL) のページでご確認ください。&lt;br&gt;&lt;br&gt;&lt;br&gt;では、上のマージ文を使って、違うデータベースにある Student テーブルのデータを同期してみましょう。&lt;br&gt;&lt;br&gt;まずデータの準備をします。 Student テーブルが存在しない Test4 と Test5 というデータベースがある前提で、以下のスクリプトを実行して Student テーブルを作ります。&lt;br&gt;&lt;br&gt;CREATE TABLE Test4.dbo.Student (&lt;br&gt;   StudentID INT NOT NULL PRIMARY KEY,&lt;br&gt;   FirstName VARCHAR(50) NULL,&lt;br&gt;   LastName VARCHAR(50) NULL,&lt;br&gt;   Birthday DATE NULL,&lt;br&gt;   Gender CHAR(1) NULL&lt;br&gt;);&lt;br&gt;&lt;br&gt;INSERT INTO Test4.dbo.Student&lt;br&gt;  (StudentID, FirstName, LastName, Birthday, Gender)&lt;br&gt; VALUES&lt;br&gt;  (1, &#039;Taro&#039;, &#039;Yamada&#039;, &#039;1980-02-15&#039;, &#039;M&#039;),&lt;br&gt;  (2, &#039;Hanako&#039;, &#039;Tanaka&#039; ,&#039;1979-12-30&#039;, &#039;F&#039;),&lt;br&gt;  (3, &#039;Yuko&#039;, &#039;Suzuki&#039;, &#039;1979-07-07&#039;, &#039;F&#039;),&lt;br&gt;  (4, &#039;Takao&#039;, &#039;Sato&#039;, &#039;1980-03-12&#039;, &#039;M&#039;),&lt;br&gt;  (5, &#039;Hiroki&#039;, &#039;Takagi&#039;, &#039;1979-04-05&#039;, &#039;M&#039;),&lt;br&gt;  (6, &#039;Yuka&#039;, &#039;Kimura&#039;, &#039;1981-03-27&#039;, &#039;F&#039;);&lt;br&gt;-----------------------------------------&lt;br&gt;CREATE TABLE Test5.dbo.Student (&lt;br&gt;   StudentID INT NOT NULL PRIMARY KEY,&lt;br&gt;   FirstName VARCHAR(50) NULL,&lt;br&gt;   LastName VARCHAR(50) NULL,&lt;br&gt;   Birthday DATE NULL,&lt;br&gt;   Gender CHAR(1) NULL&lt;br&gt;);&lt;br&gt;&lt;br&gt;INSERT INTO Test5.dbo.Student&lt;br&gt;  (StudentID, FirstName, LastName, Birthday, Gender)&lt;br&gt; VALUES&lt;br&gt;  (1, &#039;Taro&#039;, &#039;Yamamoto&#039;, &#039;1980-02-15&#039;, &#039;M&#039;),&lt;br&gt;  (2, &#039;Hanako&#039;, &#039;Tanaka&#039; ,&#039;1979-12-30&#039;, &#039;F&#039;),&lt;br&gt;  (4, &#039;Takao&#039;, &#039;Sato&#039;, &#039;1980-03-12&#039;, &#039;M&#039;),&lt;br&gt;  (5, &#039;Hiroki&#039;, &#039;Takagi&#039;, &#039;1979-05-04&#039;, &#039;M&#039;),&lt;br&gt;  (7, &#039;Sakura&#039;, &#039;Aoyama&#039;, &#039;1995-02-20&#039;, &#039;F&#039;);&lt;br&gt;SQL SERVER - MERGE でテーブルのデータを同期する 1&lt;br&gt;&lt;br&gt;&lt;br&gt;Test4 と Test5 の Student テーブルのレコードは次のようになります。&lt;br&gt;&lt;br&gt;SELECT * FROM Test4.dbo.Student;&lt;br&gt;SELECT * FROM Test5.dbo.Student;&lt;br&gt;SQL SERVER - MERGE でテーブルのデータを同期する 2&lt;br&gt;&lt;br&gt;&lt;br&gt;MERGE を使って、Test4 データベースの Student テーブルのレコードが Test5 データベースの Student テーブルのレコードと同じになるように同期してみましょう。&lt;br&gt;&lt;br&gt;この場合、Test4.dbo.Student がターゲットテーブル、Test5.dbo.Student がソーステーブルになります。&lt;br&gt;&lt;br&gt;ターゲットテーブルとソーステーブルの結合条件は StudentID として、二つのテーブルを同期するクエリーは次の通りです。&lt;br&gt;&lt;br&gt;MERGE Test4.dbo.Student AS T&lt;br&gt;USING Test5.dbo.Student AS S &lt;br&gt;ON T.StudentID = S.StudentID&lt;br&gt;WHEN MATCHED&lt;br&gt;   THEN UPDATE &lt;br&gt;      SET&lt;br&gt;         T.FirstName = S.FirstName,&lt;br&gt;         T.LastName = S.LastName,&lt;br&gt;         T.Birthday = S.Birthday,&lt;br&gt;         T.Gender = S.Gender&lt;br&gt;WHEN NOT MATCHED BY TARGET &lt;br&gt;   THEN INSERT (StudentID, FirstName, LastName, Birthday, Gender)&lt;br&gt;            VALUES (S.StudentID, S.FirstName, S.LastName, S.Birthday, S.Gender)&lt;br&gt;WHEN NOT MATCHED BY SOURCE &lt;br&gt;   THEN DELETE;&lt;br&gt;SQL SERVER - MERGE でテーブルのデータを同期する 3&lt;br&gt;&lt;br&gt;&lt;br&gt;同じ StudentID を持つレコードが存在する時は WHEN MATCHED の UPDATE 句が実行されます。（緑枠）&lt;br&gt;&lt;br&gt;ソーステーブルと同じ StudentID を持つレコードがターゲットテーブルに存在しない場合は WHEN NOT MATCHED BY TARGET の INSERT 句が実行されます。（黄枠）&lt;br&gt;&lt;br&gt;ターゲットテーブルに存在しない場合 StudentID を持つレコードがある場合は WHEN NOT MATCHED BY SOURCE の DELETE 句が実行され、ターゲットテーブルのレコードが削除されます。（赤線）&lt;br&gt;&lt;br&gt;SQL SERVER - MERGE でテーブルのデータを同期する 4&lt;br&gt;&lt;br&gt;&lt;br&gt;上記の MERGE ステートメントを実行した後に、Test4 と Test5 データベースの Student テーブルのレコードを確認するとデータが同期されていますね。&lt;br&gt;&lt;br&gt;SELECT * FROM Test4.dbo.Student;&lt;br&gt;SELECT * FROM Test5.dbo.Student;&lt;br&gt;SQL SERVER - MERGE でテーブルのデータを同期する 5&lt;br&gt;&lt;br&gt;以上、MERGE 文を使って二つのテーブルのデータを同期する方法をご紹介しました。</description><pubDate>Tue, 10 Mar 2020 17:36:00 GMT</pubDate><category>便利なT-SQL＆クエリー集</category></item>
<item><title>SQL Server Management Studio - Excel ファイルをインポートする</title><link>https://sql55.com/sql-server/how-to-import-data-from-excel-ssms.php</link><description>SQL Server Management Studio - Excel ファイルをインポートする&lt;br&gt;&lt;br&gt; &lt;br&gt;SQL Server Management Studio で Excel ファイルをインポートする&lt;br&gt;Excel ファイルのデータを SQL Server のデータベースにインポートしたい時ありますよね。&lt;br&gt;&lt;br&gt;今回は SQL Server Management Studio からウィザードを使って Excel ファイルをインポートする方法をステップを追ってご説明します。&lt;br&gt;&lt;br&gt;&lt;br&gt;次のような、従業員の情報が入った Employee.xlsx エクセルファイルがあります。&lt;br&gt;&lt;br&gt;SQL Server Management Studio - Excel ファイルをインポートする 1&lt;br&gt;&lt;br&gt;この Excel ファイルのデータを SQL Server にインポートしてみましょう。&lt;br&gt;&lt;br&gt;&lt;br&gt;Excel ファイルをインポートする手順&lt;br&gt;1. SQL Server Management Studio のオブジェクトエクスプローラでインポートするデータを保存したいデータベースを選択して右クリックし [タスク] &gt; [データのインポート] を選択します。&lt;br&gt;&lt;br&gt;SQL Server Management Studio - Excel ファイルをインポートする 2&lt;br&gt;&lt;br&gt;&lt;br&gt;2. ウィザードの説明画面が出てくるので [次へ] をクリックします。&lt;br&gt;&lt;br&gt;SQL Server Management Studio - Excel ファイルをインポートする 3&lt;br&gt;&lt;br&gt;&lt;br&gt;3. 「データソースの選択」画面が出てくるので、データソースに「Microsoft Excel」を選択し、Excelファイルパスに先ほどの Employee.xlsx ファイルの場所とファイル名を指定し、Excel のバージョンを選択します。&lt;br&gt;&lt;br&gt;Employee.xlsx ファイルのデータにはヘッダー行が含まれていますので、「先頭行に列名を含める」オプションにチェックを入れて [次へ] をクリックします。&lt;br&gt;&lt;br&gt;SQL Server Management Studio - Excel ファイルをインポートする 4&lt;br&gt;&lt;br&gt;&lt;br&gt;4. 「変換先の選択」画面が出てくるので、変換先に「SQL Server Native Client 11.0」を選択し、認証の情報を入力します。&lt;br&gt;&lt;br&gt;今回は SQL Server 認証で sa のアカウントを使いますが、権限があれば Windows 認証でも大丈夫です。&lt;br&gt;&lt;br&gt;Server name と Database は自動的に最初選択したサーバとデータベースが設定されると思います。&lt;br&gt;&lt;br&gt;入力が終わったら [次へ] をクリックします。&lt;br&gt;&lt;br&gt;SQL Server Management Studio - Excel ファイルをインポートする 5&lt;br&gt;&lt;br&gt;&lt;br&gt;5. 「テーブルのコピーまたはクエリの設定」画面が出てくるので、今回は「１つ以上のテーブルまたはビューからデータをコピーする」を選択して [次へ] をクリックします。&lt;br&gt;&lt;br&gt;SQL Server Management Studio - Excel ファイルをインポートする 6&lt;br&gt;&lt;br&gt;&lt;br&gt;6. 「コピー元のテーブルおよびビューを選択」画面が出てくるので、変換先のテーブルを [dbo].[Sheet1$] から [dbo].[Employee] に変更して、[マッピングの編集]ボタンクリックします。&lt;br&gt;&lt;br&gt;SQL Server Management Studio - Excel ファイルをインポートする 7&lt;br&gt;&lt;br&gt;&lt;br&gt;7. 「列マッピング」 の画面が表示されます。 変換先のカラム名や型、NULL の許可、サイズなどを変更したい場合はここで変更することができますが、インポート中にエラーが出ると面倒なので、私は全部インポートしてしまってからデータを検証したり、カラムの型やサイズを変更したりすることが多いです。&lt;br&gt;&lt;br&gt;よければ [次へ] をクリックします。&lt;br&gt;&lt;br&gt;SQL Server Management Studio - Excel ファイルをインポートする 8&lt;br&gt;&lt;br&gt;&lt;br&gt;8. 「コピー元のテーブルおよびビューを選択」画面に戻るので [次へ] をクリックします。&lt;br&gt;&lt;br&gt;SQL Server Management Studio - Excel ファイルをインポートする 9&lt;br&gt;&lt;br&gt;&lt;br&gt;9. 「パッケージの保存および実行」画面が出てくるので、「すぐに実行する」を選択して [次へ] をクリックします。&lt;br&gt;&lt;br&gt;SQL Server Management Studio - Excel ファイルをインポートする 10&lt;br&gt;&lt;br&gt;&lt;br&gt;10. 「ウィザードの完了」画面が出てきて、実行されるアクションの内容が表示されます。 ここで [完了] をクリックするとデータのインポートが開始します。&lt;br&gt;&lt;br&gt;SQL Server Management Studio - Excel ファイルをインポートする 11&lt;br&gt;&lt;br&gt;&lt;br&gt;11. アクションの実行結果が順番に更新されて、全て成功すると次のような画面になります。&lt;br&gt;&lt;br&gt;SQL Server Management Studio - Excel ファイルをインポートする 12&lt;br&gt;&lt;br&gt;これでエクセルファイルからのデータのインポートは完了です。 [閉じる] ボタンをクリックしてウィザード画面を閉じてください。&lt;br&gt;&lt;br&gt;&lt;br&gt;オブジェクトエクスプローラに戻ってテーブルをリフレッシュすると Employee テーブルができていて、Excel ファイルの値がインポートされていますね。&lt;br&gt;&lt;br&gt;SQL Server Management Studio - Excel ファイルをインポートする 13&lt;br&gt;&lt;br&gt;SQL Server Management Studio - Excel ファイルをインポートする 14&lt;br&gt;&lt;br&gt;以上、SQL Server Management Studio からウィザードを使って Excel ファイルをインポートする方法でした。</description><pubDate>Tue, 03 Mar 2020 01:36:00 GMT</pubDate><category>Microsoft SQL Server 入門</category></item>
<item><title>SQL SERVER - 数値を文字列に変換する</title><link>https://sql55.com/query/convert-number-to-string.php</link><description>SQL SERVER - 数値を文字列に変換する&lt;br&gt;&lt;br&gt; &lt;br&gt;数値をフォーマットされた文字列に変換する&lt;br&gt;レポートに表示したりする際など、数値型のデータを SQL Server 側でフォーマットされた文字列に変換したい時ありますよね。&lt;br&gt;&lt;br&gt;ここではよく使う、数値を文字列に変換する T-SQL のサンプルクエリーを書いておきます。&lt;br&gt;&lt;br&gt;&lt;br&gt;FORMAT を使って日付をフォーマットして文字列に変換する&lt;br&gt;数値を文字列に変換するには、SQL Server 2012 から使える FORMAT 関数使うのが簡単で便利です。&lt;br&gt;&lt;br&gt;シンタックスは FORMAT ( value, format [, culture ] ) で、 数値を変換する場合には value に数値を指定します。&lt;br&gt;&lt;br&gt;format には、スタンダードフォーマット文字列やカスタムフォーマット文字列を指定することができます。&lt;br&gt;&lt;br&gt;スタンダードフォーマット文字列には、F: 固定小数点、N: 桁区切り記号つき、C: 通貨などがあり、続けて小数点以下の桁数を 0 ~ 99 までの数字で指定できます。&lt;br&gt;&lt;br&gt;カスタムフォーマット文字列には、「0: その桁に数字があればその数字が、なければ 0 が表示される」「#: その桁に数字があればその数字が、なければ表示されない」 など、いろいろあります。&lt;br&gt;&lt;br&gt;どちらで指定しても、元の数値の小数点以下の数字が指定した桁数より多い場合、値は四捨五入されます。&lt;br&gt;&lt;br&gt;culture の引数は、通貨などカルチャーによって変換の結果が変わってくる時に、カルチャーを指定して変換するのに使われます。&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;数値を文字列に変換する T-SQL のサンプルクエリー&lt;br&gt;よく使われる、FORMAT を使った数値を文字列に変換するクエリーは以下の通りです。&lt;br&gt;&lt;br&gt;SELECT &#039;N&#039; AS FormatString, FORMAT(156256.799, &#039;N&#039;) AS StringValue UNION ALL -- 156,256.80&lt;br&gt;SELECT &#039;N0&#039;, FORMAT(156256.799, &#039;N0&#039;) UNION ALL -- 156,257&lt;br&gt;SELECT &#039;N1&#039;, FORMAT(156256.799, &#039;N1&#039;) UNION ALL -- 156,256.8&lt;br&gt;SELECT &#039;N2&#039;, FORMAT(156256.799, &#039;N2&#039;) UNION ALL -- 156,256.80&lt;br&gt;&lt;br&gt;SELECT &#039;F&#039;,  FORMAT(156256.799, &#039;F&#039;)  UNION ALL -- 156256.80&lt;br&gt;SELECT &#039;F0&#039;, FORMAT(156256.799, &#039;F0&#039;) UNION ALL -- 156257&lt;br&gt;SELECT &#039;F1&#039;, FORMAT(156256.799, &#039;F1&#039;) UNION ALL -- 156256.8&lt;br&gt;SELECT &#039;F2&#039;, FORMAT(156256.799, &#039;F2&#039;) UNION ALL -- 156256.80&lt;br&gt;&lt;br&gt;SELECT &#039;C: en-US&#039;, FORMAT(156256.799, &#039;C&#039;, &#039;en-US&#039;) UNION ALL -- $156,256.80&lt;br&gt;SELECT &#039;C: ja-JP&#039;, FORMAT(156256.799, &#039;C&#039;, &#039;ja-JP&#039;) UNION ALL -- Y156,257&lt;br&gt;&lt;br&gt;SELECT &#039;0&#039;,      FORMAT(156256.799, &#039;0&#039;)    UNION ALL --156257&lt;br&gt;SELECT &#039;0.00&#039;,   FORMAT(156256.799, &#039;0.00&#039;) UNION ALL --156256.80&lt;br&gt;SELECT &#039;#.##&#039;,   FORMAT(156256.799, &#039;#.##&#039;) UNION ALL --156256.8&lt;br&gt;SELECT &#039;#,0.00&#039;, FORMAT(156256.799, &#039;#,0.00&#039;); -- 156,256.80&lt;br&gt;SQL SERVER - 数値を文字列に変換する 1&lt;br&gt;&lt;br&gt;スタンダードフォーマット文字列の F、N は小数点以下の数字の指定をしないと、デフォルトは 2 になります。&lt;br&gt;&lt;br&gt;先ほども書きましたが、値は四捨五入されます。 切り上げ・切り捨てしないといけない時は、以下の記事を参考に切り上げ・切り捨てを行ってから、文字列に変換してくださいね。&lt;br&gt;&lt;br&gt; T-SQL: 切り上げ・切り捨て・四捨五入のページ</description><pubDate>Tue, 25 Feb 2020 02:21:00 GMT</pubDate><category>便利なT-SQL＆クエリー集</category></item>
<item><title>SQL Server - テーブルを変更してもビューは自動的に更新されない</title><link>https://sql55.com/column/sql-server-view-avoid-select-asterisk.php</link><description>SQL Server - テーブルを変更してもビューは自動的に更新されない&lt;br&gt;&lt;br&gt; &lt;br&gt;テーブルを変更してもビューは自動的に更新されない&lt;br&gt;今回は、面倒だからといって、View （ビュー）を定義する際に SELECT * FROM Table1 ... とアスタリスクを使って定義してしまうと、後で困るかもしれませんよ、というお話です。&lt;br&gt;&lt;br&gt;アスタリスクを使って定義したテーブルの真ん中あたりにカラムを追加すると、View がどうなってしまうのか見てみましょう。&lt;br&gt;&lt;br&gt;&lt;br&gt;次のような Student テーブルがあります。&lt;br&gt;&lt;br&gt;テーブルを変更してもビューは自動的に更新されない 1&lt;br&gt;&lt;br&gt;テーブルを変更してもビューは自動的に更新されない 2&lt;br&gt;&lt;br&gt;&lt;br&gt;この Student テーブルのうち、男性のみ (Gender = &#039;M&#039;) をデータを取得する MaleStudent というビューを次のように定義します。&lt;br&gt;&lt;br&gt;テーブルを変更してもビューは自動的に更新されない 3&lt;br&gt;&lt;br&gt;テーブルを変更してもビューは自動的に更新されない 4&lt;br&gt;&lt;br&gt;&lt;br&gt;この状態から、Student テーブルの LastName の次に Age カラムを追加します。&lt;br&gt;&lt;br&gt;テーブルを変更してもビューは自動的に更新されない 5&lt;br&gt;&lt;br&gt;&lt;br&gt;そして、MaleStudent ビューを SELECT してみると、次のように LastName より後ろのカラムと値がずれてしまっていますね。&lt;br&gt;&lt;br&gt;テーブルを変更してもビューは自動的に更新されない 6&lt;br&gt;&lt;br&gt;&lt;br&gt;View （ビュー）の定義に SELECT * は使わない方がいい&lt;br&gt;上で確認したように、View で SELECT * を使って定義されているテーブルにカラムが追加されると、View のカラムと値がずれてしまいます。&lt;br&gt;&lt;br&gt;何もエラーや警告なしで値だけがずれるので、気づきにくい不具合の原因になりかねません。&lt;br&gt;&lt;br&gt;View を定義する際には、できる限り SELECT * は使わないほうが良いと思います。&lt;br&gt;&lt;br&gt;&lt;br&gt;ちなみに、テーブルからカラムを削除した場合は、View を SELECT　した際に次のようなエラーになります。&lt;br&gt;&lt;br&gt;「 ビューまたは関数 &#039;dbo.MaleStudent&#039; には定義された列数よりも多くの列名が指定されています。 」&lt;br&gt;&lt;br&gt;テーブルを変更してもビューは自動的に更新されない 7&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;ビューをリフレッシュするには？&lt;br&gt;このようにテーブルの定義と合わなくなってしまった View をリフレッシュするには次のような方法があります。&lt;br&gt;&lt;br&gt;以下のように sp_refreshview というシステムストアドプロシージャを使ってリフレッシュすることができます。&lt;br&gt;&lt;br&gt;EXEC sp_refreshview &#039;ビューの名前&#039;;&lt;br&gt;テーブルを変更してもビューは自動的に更新されない 10&lt;br&gt;&lt;br&gt;&lt;br&gt;もしくは、SQL Server Management Studio から View の ALTER ステートメントを生成し、再実行してもリフレッシュされます。&lt;br&gt;&lt;br&gt;テーブルを変更してもビューは自動的に更新されない 8&lt;br&gt;&lt;br&gt;テーブルを変更してもビューは自動的に更新されない 9&lt;br&gt;&lt;br&gt;&lt;br&gt;やむを得ず、SELECT * を使って View を定義している場合は、テーブルの定義を更新した時は View 更新もお忘れなく！</description><pubDate>Wed, 12 Feb 2020 23:02:00 GMT</pubDate><category>SQL Server＆T-SQLに関するコラム</category></item>
<item><title>SQL Server - スクリプトを生成してテーブルのデータをコピーする方法</title><link>https://sql55.com/sql-server/how-to-generate-script-to-copy-table-and-data.php</link><description>SQL Server - スクリプトを生成してテーブルのデータをコピーする方法&lt;br&gt;&lt;br&gt; &lt;br&gt;SQL Server のテーブルのデータをコピーする方法&lt;br&gt;開発環境やテスト環境など、環境違いで同じスキーマのデータベースがあって、テーブルのデータをコピーしたいような時ありますよね。&lt;br&gt;&lt;br&gt;全部テーブルのデータをコピーしたいのであれば、データベースのバックアップファイルをリストアするなどして、データベースごと置き換えるのが早いですね。&lt;br&gt;&lt;br&gt;時にはテーブルひとつふたつのデーターだけコピーしたい時もあるかもしれません。&lt;br&gt;&lt;br&gt;そのような、ちょっとコピーしたい時には、SQL Server Management Studio でスクリプトを生成してデータをコピーする方法を覚えておくと便利です。&lt;br&gt;&lt;br&gt;今回は、コピー元のデータベースで INSERT スクリプトを生成してテーブルのデータをコピーする方法をご紹介します。&lt;br&gt;&lt;br&gt;&lt;br&gt;SQL Server Management Studio のスクリプトの生成&lt;br&gt;SQL Server Management Studio のスクリプトの生成機能を使って、データをコピーする INSERT スクリプトを生成します。&lt;br&gt;&lt;br&gt;以下の例では Test という名前のデータベースの Student と Test テーブルのデータの INSERT スクリプトを生成します。&lt;br&gt;&lt;br&gt;&lt;br&gt;1. オブジェクトエクスプローラーでデータベースを選択し、右クリックで [タスク] &gt; [スクリプトの生成] を選択します。&lt;br&gt;&lt;br&gt;スクリプトを生成してテーブルのデータをコピーする方法 1&lt;br&gt;&lt;br&gt;&lt;br&gt;2. ウィザードの説明のページが出てくるので [次へ] をクリックします。&lt;br&gt;&lt;br&gt;スクリプトを生成してテーブルのデータをコピーする方法 2&lt;br&gt;&lt;br&gt;&lt;br&gt;3. [オブジェクトの選択] ページが表示されるので、[特定のデータベースオブジェクトの選択] を選びます。&lt;br&gt;&lt;br&gt;「テーブル」 の横のプラスボタンをクリックしてテーブルの一覧を出し、今回データをコピーしたい Student と Test テーブルにチェックを入れ、[次へ] をクリックします。&lt;br&gt;&lt;br&gt;スクリプトを生成してテーブルのデータをコピーする方法 3&lt;br&gt;&lt;br&gt;&lt;br&gt;4. [スクリプト作成オプションの設定] ページが表示されます。 今回はスクリプトを D:\Temp\CopyData.sql ファイルに出力するようにしました。 そして、[詳細設定]をクリックします。&lt;br&gt;&lt;br&gt;スクリプトを生成してテーブルのデータをコピーする方法 4&lt;br&gt;&lt;br&gt;&lt;br&gt;5. 詳細設定の [スクリプトを作成するデータの種類]のオプションを [データのみ] に設定し、[OK] をクリックします。&lt;br&gt;&lt;br&gt;今回はコピー先のデータベースに既に同じ名前のテーブルがある前提ですが、コピー先にテーブルがない時は [スキーマとデータ] を選択してください。&lt;br&gt;&lt;br&gt;スクリプトを生成してテーブルのデータをコピーする方法 8&lt;br&gt;&lt;br&gt;&lt;br&gt;6. 先ほどの [スクリプト作成オプションの設定] の画面に戻るので、そこから [次へ] をクリックします。&lt;br&gt;&lt;br&gt;スクリプトを生成してテーブルのデータをコピーする方法 9&lt;br&gt;&lt;br&gt;&lt;br&gt;7. [概要] ページが表示されるので [次へ] をクリックします。&lt;br&gt;&lt;br&gt;スクリプトを生成してテーブルのデータをコピーする方法 5&lt;br&gt;&lt;br&gt;&lt;br&gt;8. [スクリプトの保存またはパブリッシュ] ページが表示され、アクションの実行結果が表示されるので終わったら [完了] をクリックします。&lt;br&gt;&lt;br&gt;スクリプトを生成してテーブルのデータをコピーする方法 6&lt;br&gt;&lt;br&gt;&lt;br&gt;生成された CopyData.sql ファイルを開いてみると、Student と Test テーブルのデータの INSERT ステートメントが生成されています。&lt;br&gt;&lt;br&gt;Student と Test テーブルには IDENTITY カラムがあるので、データをインサートできるように SET IDENTITY_INSERT の ON/OFF まで追加してくれています。&lt;br&gt;&lt;br&gt;スクリプトを生成してテーブルのデータをコピーする方法 7&lt;br&gt;&lt;br&gt;&lt;br&gt;このスクリプトをコピー先のデータベースで実行します。 データベース名が違う場合は一番上の行の USE の後のデータベース名を変更して実行してください。&lt;br&gt;&lt;br&gt;スクリプトを生成してテーブルのデータをコピーする方法 10&lt;br&gt;&lt;br&gt;これで、コピー元のデータベースの Student と Test テーブルのデータが、コピー先のデータベースの Student と Test テーブルにコピーできました。&lt;br&gt;&lt;br&gt;&lt;br&gt;スクリプトを生成してテーブルのデータをコピーする際の注意点&lt;br&gt;この方法は単純に選択したテーブルのデータに対して INSERT ステートメントを生成し、それを実行するだけです。&lt;br&gt;&lt;br&gt;ですので、挿入しようとするデータが、コピー先のテーブルの制約違反になるようなケースはエラーになります。&lt;br&gt;&lt;br&gt;&lt;br&gt;例えば、コピー先のテーブルのプライマリーキーなど UNIQUE 制約がついているカラムの値と重複してしまうデータがある場合はエラーになります。&lt;br&gt;&lt;br&gt;コピー元のデータと全く同じにしたい時は、コピー先のテーブルのレコードを全て削除してからスクリプトを実行すると良いと思います。&lt;br&gt;&lt;br&gt;&lt;br&gt;また、コピー先のテーブルに外部キーのついているカラムの値が含まれていて、その外部キーが参照しているカラムに挿入しようとしている値がないとエラーになります。&lt;br&gt;&lt;br&gt;関連するデータはプライマリーキーとなるテーブルから順序を考慮しながら全てコピーするようにしてくださいね。&lt;br&gt;&lt;br&gt;</description><pubDate>Tue, 04 Feb 2020 00:29:00 GMT</pubDate><category>Microsoft SQL Server 入門</category></item>
<item><title>SQL - BETWEEN の使い方</title><link>https://sql55.com/t-sql/sql-between.php</link><description>SQL - BETWEEN の使い方&lt;br&gt; &lt;br&gt;SQL の BETWEEN オペレータ&lt;br&gt;SQL の BETWEEN オペレータは、範囲を指定して、値がその範囲内にある場合は TRUE を、そうでなければ FALSE を返してくれるオペレーターです。&lt;br&gt;&lt;br&gt;WHERE 句 や CASE WHEN の条件文など、boolean(ブーリアン)を返す式が必要な箇所で使えます。&lt;br&gt;&lt;br&gt;今回は、SQL の BETWEEN の使い方や注意点などをご説明します。&lt;br&gt;&lt;br&gt;目次&lt;br&gt;1. BETWEEN の使い方&lt;br&gt;2. NOT BETWEEN の使い方&lt;br&gt;3. BETWEEN の範囲の値は含む？&lt;br&gt;4. BETWEEN で NULL が絡むとどうなる？&lt;br&gt;5. BETWEEN で日付の範囲を指定する&lt;br&gt;&lt;br&gt; &lt;br&gt;BETWEEN の使い方&lt;br&gt;まずは、SQL の BETWEEN オペレータの使い方です。&lt;br&gt;&lt;br&gt;BETWEEN オペレータの構文は以下の通りです。&lt;br&gt;&lt;br&gt;[評価する値] BETWEEN [範囲開始の値] AND [範囲終了の値]&lt;br&gt;[評価する値] が [範囲開始の値] ～ [範囲終了の値] にある場合は TRUE を、そうでなければ FALSE を返します。&lt;br&gt;&lt;br&gt;[評価する値]、[範囲開始の値]、[範囲終了の値] は基本的に同じデータ型でなくてはいけません。&lt;br&gt;&lt;br&gt;暗黙的な変換が行われてうまくいく場合もありますが、できるだけ同じデータ型の値を指定しましょう。&lt;br&gt;&lt;br&gt;&lt;br&gt;例えば、次のような Student テーブルがあります。&lt;br&gt;&lt;br&gt;SQL - BETWEEN の使い方 1&lt;br&gt;&lt;br&gt;このうち、StudentID が 2 ~ 5 までのレコードを取得したい時は、BETWEEN を使って次のように取得することができます。&lt;br&gt;&lt;br&gt;SELECT	* &lt;br&gt;FROM	Student&lt;br&gt;WHERE	StudentID BETWEEN 2 AND 5;&lt;br&gt;SQL - BETWEEN の使い方 2&lt;br&gt;&lt;br&gt;&lt;br&gt;NOT BETWEEN の使い方&lt;br&gt;続いて SQL の NOT BETWEEN の使い方です。&lt;br&gt;&lt;br&gt;構文は先ほどの BETWEEN の前に NOT を付けます。&lt;br&gt;&lt;br&gt;[評価する値] NOT BETWEEN [範囲開始の値] AND [範囲終了の値]&lt;br&gt;NOT BETWEEN では [評価する値] が [範囲開始の値] より前、もしくは [範囲終了の値] より後にある場合は TRUE を、そうでなければ FALSE を返します。&lt;br&gt;&lt;br&gt;&lt;br&gt;例えば、先ほどのクエリーの前に NOT をつけて実行すると、次のように StudentID が 2 より小さいレコードと、5 より大きいレコードが得られます。&lt;br&gt;&lt;br&gt;SELECT	* &lt;br&gt;FROM	Student&lt;br&gt;WHERE	StudentID NOT BETWEEN 2 AND 5;&lt;br&gt;SQL - BETWEEN の使い方 3&lt;br&gt;&lt;br&gt;&lt;br&gt;BETWEEN の範囲の値は含む？&lt;br&gt;上の結果でおわかりかもしれませんが、BETWEEN が値を評価する際に、範囲の開始終了値を含むかどうかですが、正解は 「含みます」。&lt;br&gt;&lt;br&gt;[評価する値] が [範囲開始の値] もしくは [範囲終了の値] の時は TRUE を返します。&lt;br&gt;&lt;br&gt;ですので以下の二つのクエリーは同じ結果を返します。&lt;br&gt;&lt;br&gt;SELECT	* &lt;br&gt;FROM	Student&lt;br&gt;WHERE	StudentID BETWEEN 2 AND 5;&lt;br&gt;&lt;br&gt;SELECT	* &lt;br&gt;FROM	Student&lt;br&gt;WHERE	StudentID &gt;= 2&lt;br&gt;	AND StudentID &lt;= 5;&lt;br&gt;SQL - BETWEEN の使い方 4&lt;br&gt;&lt;br&gt;&lt;br&gt;NOT BETWEEN の時は [評価する値] が [範囲開始の値] もしくは [範囲終了の値] の時は FALSE を返しますので、範囲の開始終了値は 「含まず」、次のクエリーと同じ結果を返します。&lt;br&gt;&lt;br&gt;SELECT	* &lt;br&gt;FROM	Student&lt;br&gt;WHERE	StudentID NOT BETWEEN 2 AND 5;&lt;br&gt;&lt;br&gt;SELECT	* &lt;br&gt;FROM	Student&lt;br&gt;WHERE	StudentID &lt; 2&lt;br&gt;	OR StudentID &gt; 5;&lt;br&gt;SQL - BETWEEN の使い方 4-2&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;BETWEEN で NULL が絡むとどうなる？&lt;br&gt;BETWEEN の [評価する値]、[範囲開始の値]、[範囲終了の値] のどれかひとつでも NULL になると、評価の結果は UNKNOWN となり、FALSE と同様の扱いになります。&lt;br&gt;&lt;br&gt;特に次のように [範囲開始の値] か [範囲終了の値] が NULL になる可能性がある時は、評価の結果が全レコード UNKNOWN になってしまいますので、注意してください。&lt;br&gt;&lt;br&gt;DECLARE @StudentIDFrom INT = 2,&lt;br&gt;	@StudentIDTo INT;&lt;br&gt;&lt;br&gt;SELECT	* &lt;br&gt;FROM	Student&lt;br&gt;WHERE	StudentID BETWEEN @StudentIDFrom AND @StudentIDTo;&lt;br&gt;SQL - BETWEEN の使い方 5&lt;br&gt;&lt;br&gt;&lt;br&gt;NOT BETWEEN のほうは、先ほど同等のクエリーでご紹介したように OR 扱いなので、NULL じゃないほうの範囲の条件は効いて、StudentID が 2 より小さいレコードが返ってきていますね。&lt;br&gt;&lt;br&gt;DECLARE @StudentIDFrom INT = 2,&lt;br&gt;	@StudentIDTo INT;&lt;br&gt;&lt;br&gt;SELECT	* &lt;br&gt;FROM	Student&lt;br&gt;WHERE	StudentID NOT BETWEEN @StudentIDFrom AND @StudentIDTo;&lt;br&gt;SQL - BETWEEN の使い方 5-2&lt;br&gt;&lt;br&gt;NULL は比較の際に期待する結果が得られない原因になる可能性がありますので、先に NULL をチェックして値を置き換えるなど、NULL の時の扱いが一目でわかるようなクエリーにしておくと良いと思います。&lt;br&gt;&lt;br&gt;&lt;br&gt;BETWEEN で日付の範囲を指定する&lt;br&gt;BETWEEN で日付の範囲を指定する際に少し気を付けなければいけないことがあります。&lt;br&gt;&lt;br&gt;DATETIME などの時間を含める日付型の場合、[範囲開始の値] と [範囲終了の値] に日付のみを指定すると、[範囲終了の値] の日付はその日の 0 時ちょうど以外含まれないことになります。&lt;br&gt;&lt;br&gt;言葉ではわかりにくいかもしれないので、例をあげて説明します。&lt;br&gt;&lt;br&gt;先ほどの Student テーブルに DATETIME 型の ModifiedOn カラムを追加して、ModifiedOn 順にソートしました。&lt;br&gt;&lt;br&gt;SQL - BETWEEN の使い方 6&lt;br&gt;&lt;br&gt;このテーブルに対して、2020 年 1 月 2 日 ～ 2020 年 1 月 5 日 に変更されたデータを取得したいと思って、次のように BETWEEN を使ってしまうと 1 月 5 日に変更したデータが得られません。&lt;br&gt;&lt;br&gt;DECLARE @ModifiedDateFrom DATE = &#039;2020-01-02&#039;,&lt;br&gt;	@ModifiedDateTo DATE= &#039;2020-01-05&#039;;&lt;br&gt;&lt;br&gt;SELECT	 *&lt;br&gt;FROM	 Student&lt;br&gt;WHERE	 ModifiedOn BETWEEN @ModifiedDateFrom AND @ModifiedDateTo	&lt;br&gt;ORDER BY ModifiedOn;&lt;br&gt;SQL - BETWEEN の使い方 7&lt;br&gt;&lt;br&gt;これは、@ModifiedDateFrom と @ModifiedDateTo が DATETIME に変換され、ModifiedOn が &quot;2020-01-02 00:00:00.000&quot; 以降で &quot;2020-01-05 00:00:00.000&quot; 以前の時のみ TRUE を返すからです。&lt;br&gt;&lt;br&gt;&lt;br&gt;日付の箇所のみを比較するには BETWEEN を使わずに DATEDIFF を使ったり、データ型に応じて [範囲終了の値] の日付に TIME の部分の最大値を追加して比較したり、いろんな方法があります。&lt;br&gt;&lt;br&gt;このように、BETWEEN を使わずに [範囲終了の値] の日付に 1 日足して、&lt;= ではなく &lt; にするのもいいと思いますし、ModifiedOn を DATE に変換してしまうのも、ひとつの手です。&lt;br&gt;&lt;br&gt;DECLARE @ModifiedDateFrom1 DATE = &#039;2020-01-02&#039;,&lt;br&gt;	@ModifiedDateTo1 DATE= &#039;2020-01-06&#039;;&lt;br&gt;	&lt;br&gt;SELECT	 *&lt;br&gt;FROM	 Student&lt;br&gt;WHERE	 ModifiedOn &gt;= @ModifiedDateFrom1&lt;br&gt;	 AND ModifiedOn &lt; @ModifiedDateTo1&lt;br&gt;ORDER BY ModifiedOn;&lt;br&gt;&lt;br&gt;-------------------------&lt;br&gt;&lt;br&gt;DECLARE @ModifiedDateFrom2 DATE = &#039;2020-01-02&#039;,&lt;br&gt;	@ModifiedDateTo2 DATE= &#039;2020-01-05&#039;;&lt;br&gt;&lt;br&gt;SELECT	 *&lt;br&gt;FROM	 Student&lt;br&gt;WHERE	 CONVERT(DATE, ModifiedOn) BETWEEN @ModifiedDateFrom2 AND @ModifiedDateTo2	&lt;br&gt;ORDER BY ModifiedOn;&lt;br&gt;SQL - BETWEEN の使い方 8&lt;br&gt;&lt;br&gt;データ取得のパフォーマンスが良いのは 1 日足す方法かと思いますが、どの方法を使うかはデータ量やインデックスのありなし、開発やメンテナンスの大変さなど、状況に応じて使い分けたら良いと思っています。&lt;br&gt;&lt;br&gt;BETWEEN で DATE の範囲を指定する際にはご注意くださいね。&lt;br&gt;&lt;br&gt;&lt;br&gt;以上、SQL の BETWEEN の使い方と注意点などをご説明しました。</description><pubDate>Fri, 17 Jan 2020 21:19:00 GMT</pubDate><category>T-SQL 入門</category></item>
<item><title>SQL Server 2019 で廃止・非推奨になった機能について</title><link>https://sql55.com/column/sql-server-2019-discontinued-deprecated-features.php</link><description>SQL Server 2019 で廃止・非推奨になった機能について&lt;br&gt; &lt;br&gt;SQL Server 2019 のリリース&lt;br&gt;2019 年 11 月に Microsoft SQL Server 2019 の RTM 版がリリースされました。&lt;br&gt;&lt;br&gt;新しい機能も気になりますが、開発者としては廃止・非推奨になった機能もおさえておきたいですね。&lt;br&gt;&lt;br&gt;私も SQL Server 2019 のデータベースエンジンで廃止・非推奨になった機能について調べてみましたが、SQL Server 2017 から SQL Server 2019 で廃止・非推奨になった機能はほとんどないようなものでした。&lt;br&gt;&lt;br&gt;一応、マイクソロフトのサイトで見つけた SQL Server 2019 のデータベースエンジンで廃止・非推奨になった機能の情報を以下にまとめておきます。&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;SQL Server 2019 で廃止・非推奨になった機能&lt;br&gt;まず、SQL Server 2019 のデータベースエンジンで廃止になった機能は以下のデータベースのスコープ構成オプションです。&lt;br&gt;&lt;br&gt;DISABLE_BATCH_MODE_ADAPTIVE_JOIN&lt;br&gt;DISABLE_BATCH_MODE_MEMORY_GRANT_FEEDBACK&lt;br&gt;DISABLE_INTERLEAVED_EXECUTION_TVF&lt;br&gt;これらのオプションは完全になくなった訳ではなく、それぞれオプション名が次のものに変更になったようです。&lt;br&gt;&lt;br&gt;BATCH_MODE_ADAPTIVE_JOINS&lt;br&gt;BATCH_MODE_MEMORY_GRANT_FEEDBACK&lt;br&gt;INTERLEAVED_EXECUTION_TVF&lt;br&gt;&lt;br&gt;そして、SQL Server 2019 のデータベースエンジンで新しく非推奨に加わった機能はありませんでした。&lt;br&gt;&lt;br&gt;また、SQL Server 2019 のデータベースエンジンで重大な変更として発表されたものもありませんでした。&lt;br&gt;&lt;br&gt;&lt;br&gt;SQL Server 2017 でも非推奨となった機能はありませんでしたが、SQL Server 2016 では text や image データ型など非推奨となった機能がいろいろありました。&lt;br&gt;&lt;br&gt;新しいシステムを開発する際には、非推奨の機能を使わないようにお気をつけくださいね。</description><pubDate>Fri, 20 Dec 2019 19:14:00 GMT</pubDate><category>SQL Server＆T-SQLに関するコラム</category></item>
<item><title>SQL Server: データベース内の全てのインデックス (index) を取得する</title><link>https://sql55.com/query/sql-server-list-all-indexes.php</link><description>SQL Server: データベース内の全てのインデックス (index) を取得する&lt;br&gt;&lt;br&gt; &lt;br&gt;データベース内の全てのインデックス (index) を取得するには？&lt;br&gt;インデックスの見直しなどで、データベース内の全インデックス (index) の一覧を確認したいような時があるかもしれません。&lt;br&gt;&lt;br&gt;今回は、データベース内の全てのインデックス (index) を取得するサンプルクエリーをご紹介します。&lt;br&gt;&lt;br&gt;&lt;br&gt;sys.indexes を使って全インデックス (index) を取得する&lt;br&gt;sys.indexes というシステムカタログビューを使うと、選択されているデータベース内のインデックスの情報を取得することができます。&lt;br&gt;&lt;br&gt;データベース内のユーザーが定義したオブジェクトに生成した全てのインデックス (index) を取得するクエリーは以下の通りです。&lt;br&gt;&lt;br&gt;SELECT	S.name AS SchemaName,&lt;br&gt;	O.name AS ObjectName,&lt;br&gt;	I.name AS IndexName,&lt;br&gt;	I.type_desc AS IndexTypeDesc,&lt;br&gt;	I.is_primary_key AS IsPrimaryKey,&lt;br&gt;	I.is_unique AS IsUnique,&lt;br&gt;	I.is_disabled AS IsDisabled&lt;br&gt;FROM	sys.indexes AS I&lt;br&gt;	   INNER JOIN sys.objects AS O&lt;br&gt;	      ON I.object_id = O.object_id&lt;br&gt;	   INNER JOIN sys.schemas AS S&lt;br&gt;	      ON O.schema_id = S.schema_id&lt;br&gt;WHERE	I.index_id &gt; 0&lt;br&gt;	AND O.is_ms_shipped = 0&lt;br&gt;ORDER BY S.name,&lt;br&gt;	 O.name,&lt;br&gt;	 I.name;&lt;br&gt;データベース内の全てのインデックス (index) を取得する 1&lt;br&gt;&lt;br&gt;SchemaName と ObjectName はそのインデックスが属しているテーブルやビューのものです。&lt;br&gt;&lt;br&gt;sys.indexes の index_id &gt; 0 でフィルターすることでヒープのオブジェクトを除いて、クラスター化と非クラスター化インデックスを取得しています。&lt;br&gt;&lt;br&gt;システムカタログビューの sys.objects の is_ms_shipped = 0 でフィルターすることで、ユーザーが定義したオブジェクトに生成したインデックスを取得しています。&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;インデックスのキー列と非キー列（付加列）も同時に取得する&lt;br&gt;インデックスのキー列と非キー列（付加列）も同時に確認したい時があるかもしれません。&lt;br&gt;&lt;br&gt;そんな時は、システムカタログビューの sys.index_columns から情報を取得できます。&lt;br&gt;&lt;br&gt;インデックスの一覧と、そのキー列を KeyColumns に、非キー列を IncludedColumns として、カンマ区切りで取得するクエリーは以下の通りです。&lt;br&gt;&lt;br&gt;SELECT	S.name AS SchemaName,&lt;br&gt;	O.name AS ObjectName,&lt;br&gt;	I.name AS IndexName,&lt;br&gt;	I.type_desc AS IndexTypeDesc,&lt;br&gt;	I.is_primary_key AS IsPrimaryKey,&lt;br&gt;	I.is_unique AS IsUnique,&lt;br&gt;	I.is_disabled AS IsDisabled,&lt;br&gt;	STUFF((SELECT	&#039;,&#039; + COL_NAME(IC.object_id, IC.column_id)&lt;br&gt;               FROM	sys.index_columns AS IC&lt;br&gt;	       WHERE	IC.is_included_column = 0&lt;br&gt;			AND IC.object_id = I.object_id&lt;br&gt;			AND IC.index_id = I.index_id&lt;br&gt;               ORDER BY IC.key_ordinal&lt;br&gt;               FOR XML PATH (&#039;&#039;)), 1, 1, &#039;&#039;) AS KeyColumns,&lt;br&gt;	STUFF((SELECT	&#039;,&#039; + COL_NAME(IC.object_id, IC.column_id)&lt;br&gt;               FROM	sys.index_columns AS IC&lt;br&gt;	       WHERE	IC.is_included_column = 1&lt;br&gt;			AND IC.object_id = I.object_id&lt;br&gt;			AND IC.index_id = I.index_id&lt;br&gt;                ORDER BY IC.index_column_id&lt;br&gt;                FOR XML PATH (&#039;&#039;)), 1, 1, &#039;&#039;) AS IncludedColumns&lt;br&gt;FROM	sys.indexes AS I&lt;br&gt;	   INNER JOIN sys.objects AS O&lt;br&gt;	      ON I.object_id = O.object_id&lt;br&gt;	   INNER JOIN sys.schemas AS S&lt;br&gt;	      ON O.schema_id = S.schema_id&lt;br&gt;WHERE	I.index_id &gt; 0&lt;br&gt;	AND O.is_ms_shipped = 0&lt;br&gt;ORDER BY S.name,&lt;br&gt;	 O.name,&lt;br&gt;	 I.name;&lt;br&gt;データベース内の全てのインデックス (index) を取得する 2&lt;br&gt;&lt;br&gt;sys.index_columns の is_included_column が 0 のレコードがキー列、 1 のレコードが非キー列です。&lt;br&gt;&lt;br&gt;&lt;br&gt;インデックスの断片化情報を同時に取得する&lt;br&gt;おまけに sys.dm_db_index_physical_stats というシステム動的管理ビューを使うと、インデックスの断片化などの情報を取得することができます。&lt;br&gt;&lt;br&gt;SELECT	S.name AS SchemaName,&lt;br&gt;	O.name AS ObjectName,&lt;br&gt;	I.name AS IndexName,	&lt;br&gt;	PS.avg_fragmentation_in_percent&lt;br&gt;FROM	sys.indexes AS I&lt;br&gt;	　　　INNER JOIN sys.objects AS O&lt;br&gt;	　　　　　　ON I.object_id = O.object_id&lt;br&gt;	　　　INNER JOIN sys.schemas AS S&lt;br&gt;	　　　　　　ON O.schema_id = S.schema_id&lt;br&gt;	　　　INNER JOIN sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL , NULL, NULL) AS PS&lt;br&gt;	　　　　　　ON I.object_id = PS.object_id&lt;br&gt;	　　　　　　　　　AND I.index_id = PS.index_id&lt;br&gt;WHERE	I.index_id &gt; 0&lt;br&gt;	AND O.is_ms_shipped = 0&lt;br&gt;	AND PS.avg_fragmentation_in_percent &gt; 0&lt;br&gt;ORDER BY　S.name,&lt;br&gt;	　O.name,&lt;br&gt;	　I.name;&lt;br&gt;データベース内の全てのインデックス (index) を取得する 3&lt;br&gt;&lt;br&gt;最後のクエリーはデータベース内の全インデックスではなく、avg_fragmentation_in_percent が 0 より大きいインデックスのみを取得していますのでご注意ください。</description><pubDate>Wed, 18 Dec 2019 20:50:00 GMT</pubDate><category>便利なT-SQL＆クエリー集</category></item>
<item><title>T-SQL: 名前空間が指定された XML からデータを取得する</title><link>https://sql55.com/query/t-sql-query-xml-with-namespace.php</link><description>T-SQL: 名前空間が指定された XML からデータを取得する&lt;br&gt; 0   0 　　　　&lt;br&gt;&lt;br&gt; &lt;br&gt;名前空間が指定された XML&lt;br&gt;前回 「 T-SQL クエリーで XML をテーブル形式に変換する 」 では、名前空間の指定されていないシンプルな XML から値を取得する方法をご紹介しました。&lt;br&gt;&lt;br&gt;XML に名前空間の指定があると、XML データ型メソッドを使う際にも、名前空間の指定が必要になります。&lt;br&gt;&lt;br&gt;ここでは、名前空間が指定された XML からデータを取得する方法をご紹介します。&lt;br&gt;&lt;br&gt;&lt;br&gt;XML にデフォルトの名前空間のみが指定されているケース&lt;br&gt;まずは、XML デフォルトの名前空間のみが指定されているケースです。&lt;br&gt;&lt;br&gt;「 T-SQL クエリーで XML をテーブル形式に変換する 」 で使った XML の Students エレメントに、デフォルトの名前空間 xmlns=&quot;https://sql55.com/Schemas/Students&quot; を追加します。&lt;br&gt;&lt;br&gt;&lt;Students xmlns=&quot;https://sql55.com/Schemas/Students&quot;&gt;&lt;br&gt;　　　&lt;Student ID=&quot;1&quot;&gt;&lt;br&gt;　　　　　　&lt;StudentInfo&gt;&lt;br&gt;　　　　　　　　　&lt;FirstName&gt;Saki&lt;/FirstName&gt;&lt;br&gt;　　　　　　　　　&lt;LastName&gt;Suzuki&lt;/LastName&gt;&lt;br&gt;　　　　　　&lt;/StudentInfo&gt;&lt;br&gt;　　　　　　&lt;TestResultCount&gt;2&lt;/TestResultCount&gt;&lt;br&gt;　　　　　　&lt;ScoreAverage&gt;92.00&lt;/ScoreAverage&gt;&lt;br&gt;　　　&lt;/Student&gt;&lt;br&gt;　　　&lt;Student ID=&quot;2&quot;&gt;&lt;br&gt;　　　　　　&lt;StudentInfo&gt;&lt;br&gt;　　　　　　　　　&lt;FirstName&gt;Miki&lt;/FirstName&gt;&lt;br&gt;　　　　　　　　　&lt;LastName&gt;Sato&lt;/LastName&gt;&lt;br&gt;　　　　　　&lt;/StudentInfo&gt;&lt;br&gt;　　　　　　&lt;TestResultCount&gt;3&lt;/TestResultCount&gt;&lt;br&gt;　　　　　　&lt;ScoreAverage&gt;89.50&lt;/ScoreAverage&gt;&lt;br&gt;　　　&lt;/Student&gt;&lt;br&gt;&lt;/Students&gt;&lt;br&gt;接頭辞のついていない要素はデフォルトの名前空間に属していることになります。&lt;br&gt;&lt;br&gt;XML にデフォルトの名前空間が宣言されていると、「 T-SQL クエリーで XML をテーブル形式に変換する 」 でご紹介したクエリーのままでは、XML からデータを取得できません。&lt;br&gt;&lt;br&gt;名前空間が指定された XML からデータを取得する 2&lt;br&gt;&lt;br&gt;&lt;br&gt;デフォルトの名前空間を指定して、XML から値を取得するクエリーは次の通りです。&lt;br&gt;&lt;br&gt;DECLARE @XMLData1 XML = &lt;br&gt;&#039;&lt;Students xmlns=&quot;https://sql55.com/Schemas/Students&quot;&gt;&lt;br&gt;　　　&lt;Student ID=&quot;1&quot;&gt;&lt;br&gt;　　　　　　&lt;StudentInfo&gt;&lt;br&gt;　　　　　　　　　&lt;FirstName&gt;Saki&lt;/FirstName&gt;&lt;br&gt;　　　　　　　　　&lt;LastName&gt;Suzuki&lt;/LastName&gt;&lt;br&gt;　　　　　　&lt;/StudentInfo&gt;&lt;br&gt;　　　　　　&lt;TestResultCount&gt;2&lt;/TestResultCount&gt;&lt;br&gt;　　　　　　&lt;ScoreAverage&gt;92.00&lt;/ScoreAverage&gt;&lt;br&gt;　　　&lt;/Student&gt;&lt;br&gt;　　　&lt;Student ID=&quot;2&quot;&gt;&lt;br&gt;　　　　　　&lt;StudentInfo&gt;&lt;br&gt;　　　　　　　　　&lt;FirstName&gt;Miki&lt;/FirstName&gt;&lt;br&gt;　　　　　　　　　&lt;LastName&gt;Sato&lt;/LastName&gt;&lt;br&gt;　　　　　　&lt;/StudentInfo&gt;&lt;br&gt;　　　　　　&lt;TestResultCount&gt;3&lt;/TestResultCount&gt;&lt;br&gt;　　　　　　&lt;ScoreAverage&gt;89.50&lt;/ScoreAverage&gt;&lt;br&gt;　　　&lt;/Student&gt;&lt;br&gt;&lt;/Students&gt;&#039;;&lt;br&gt;&lt;br&gt;WITH XMLNAMESPACES (DEFAULT &#039;https://sql55.com/Schemas/Students&#039;)  &lt;br&gt;SELECT	T.C.value(&#039;@ID&#039;, &#039;INT&#039;) AS StudentID,&lt;br&gt;	T.C.value(&#039;(StudentInfo/FirstName)[1]&#039;, &#039;NVARCHAR(MAX)&#039;) AS FirstName,&lt;br&gt;	T.C.value(&#039;(StudentInfo/LastName)[1]&#039;, &#039;NVARCHAR(MAX)&#039;) AS LastName,&lt;br&gt;	T.C.value(&#039;TestResultCount[1]&#039;, &#039;INT&#039;) AS TestResultCount,&lt;br&gt;	T.C.value(&#039;ScoreAverage[1]&#039;, &#039;DECIMAL(5,2)&#039;) AS ScoreAverage&lt;br&gt;FROM	@XMLData1.nodes(&#039;/Students/Student&#039;) AS T(C);&lt;br&gt;[ 実行結果 ]&lt;br&gt;名前空間が指定された XML からデータを取得する 1&lt;br&gt;&lt;br&gt;デフォルトの名前空間を指定するには WITH XMLNAMESPACES (DEFAULT &#039;XML名前空間のURI&#039;) を使います。&lt;br&gt;&lt;br&gt; WITH というキーワードは T-SQL クエリーの他の用途でも使われるので、直前のステートメントがセミコロンで終わらないとシンタックスエラーになります。 ステートメントの最後のセミコロン自体はオプショナルなので、もし普段セミコロンを付けない方は、 ;WITH のように　WITH の前にセミコロンを付けてください。&lt;br&gt;XML データ型メソッドの value() や nodes() の説明は 「 T-SQL クエリーで XML をテーブル形式に変換する 」 をご覧ください。&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;XML に複数の名前空間が指定されているケース&lt;br&gt;次は XML に複数の名前空間が指定されているケースです。&lt;br&gt;&lt;br&gt;例えば、この XML では、デフォルトの名前空間 xmlns=&quot;https://sql55.com/Schemas/Students&quot; の他に、ns1 という接頭辞で xmlns:ns1=&quot;https://test.com/Student&quot; が指定されています。&lt;br&gt;&lt;br&gt;1 個目と 3 個目の Student 要素は接頭辞がついていないのでデフォルトの名前空間 &quot;https://sql55.com/Schemas/Students&quot; に、 2 個目の Student は要素の前に ns1: がついているので &quot;https://test.com/Student&quot; の名前空間に属します。&lt;br&gt;&lt;br&gt;&lt;Students xmlns=&quot;https://sql55.com/Schemas/Students&quot; &lt;br&gt;	  xmlns:ns1=&quot;https://test.com/Student&quot;&gt;&lt;br&gt;　　　&lt;Student ID=&quot;1&quot;&gt;&lt;br&gt;　　　　　　&lt;StudentInfo&gt;&lt;br&gt;　　　　　　　　　&lt;FirstName&gt;Saki&lt;/FirstName&gt;&lt;br&gt;　　　　　　　　　&lt;LastName&gt;Suzuki&lt;/LastName&gt;&lt;br&gt;　　　　　　&lt;/StudentInfo&gt;&lt;br&gt;　　　　　　&lt;TestResultCount&gt;2&lt;/TestResultCount&gt;&lt;br&gt;　　　　　　&lt;ScoreAverage&gt;92.00&lt;/ScoreAverage&gt;&lt;br&gt;　　　&lt;/Student&gt;&lt;br&gt;　　　&lt;ns1:Student&gt;&lt;br&gt;　　　　　 &lt;ns1:FirstName&gt;Jun&lt;/ns1:FirstName&gt;&lt;br&gt;　　　　　 &lt;ns1:LastName&gt;Taguchi&lt;/ns1:LastName&gt;&lt;br&gt;　　　　　 &lt;ns1:Gender&gt;M&lt;/ns1:Gender&gt;&lt;br&gt;　　　　　 &lt;ns1:ScoreAverage&gt;85.64&lt;/ns1:ScoreAverage&gt;&lt;br&gt;　　　&lt;/ns1:Student&gt;&lt;br&gt;　　　&lt;Student ID=&quot;2&quot;&gt;&lt;br&gt;　　　　　　&lt;StudentInfo&gt;&lt;br&gt;　　　　　　　　　&lt;FirstName&gt;Miki&lt;/FirstName&gt;&lt;br&gt;　　　　　　　　　&lt;LastName&gt;Sato&lt;/LastName&gt;&lt;br&gt;　　　　　　&lt;/StudentInfo&gt;&lt;br&gt;　　　　　　&lt;TestResultCount&gt;3&lt;/TestResultCount&gt;&lt;br&gt;　　　　　　&lt;ScoreAverage&gt;89.50&lt;/ScoreAverage&gt;&lt;br&gt;　　　&lt;/Student&gt;&lt;br&gt;&lt;/Students&gt;&lt;br&gt;この XML から名前空間を指定して、データを取得するクエリーは以下の通りです。&lt;br&gt;&lt;br&gt;DECLARE @XMLData2 XML = &lt;br&gt;&#039;&lt;Students xmlns=&quot;https://sql55.com/Schemas/Students&quot; &lt;br&gt;	  xmlns:ns1=&quot;https://test.com/Student&quot;&gt;&lt;br&gt;　　　&lt;Student ID=&quot;1&quot;&gt;&lt;br&gt;　　　　　　&lt;StudentInfo&gt;&lt;br&gt;　　　　　　　　　&lt;FirstName&gt;Saki&lt;/FirstName&gt;&lt;br&gt;　　　　　　　　　&lt;LastName&gt;Suzuki&lt;/LastName&gt;&lt;br&gt;　　　　　　&lt;/StudentInfo&gt;&lt;br&gt;　　　　　　&lt;TestResultCount&gt;2&lt;/TestResultCount&gt;&lt;br&gt;　　　　　　&lt;ScoreAverage&gt;92.00&lt;/ScoreAverage&gt;&lt;br&gt;　　　&lt;/Student&gt;&lt;br&gt;　　　&lt;ns1:Student&gt;&lt;br&gt;　　　　　 &lt;ns1:FirstName&gt;Jun&lt;/ns1:FirstName&gt;&lt;br&gt;　　　　　 &lt;ns1:LastName&gt;Taguchi&lt;/ns1:LastName&gt;&lt;br&gt;　　　　　 &lt;ns1:Gender&gt;M&lt;/ns1:Gender&gt;&lt;br&gt;　　　　　 &lt;ns1:ScoreAverage&gt;85.64&lt;/ns1:ScoreAverage&gt;&lt;br&gt;　　　&lt;/ns1:Student&gt;&lt;br&gt;　　　&lt;Student ID=&quot;2&quot;&gt;&lt;br&gt;　　　　　　&lt;StudentInfo&gt;&lt;br&gt;　　　　　　　　　&lt;FirstName&gt;Miki&lt;/FirstName&gt;&lt;br&gt;　　　　　　　　　&lt;LastName&gt;Sato&lt;/LastName&gt;&lt;br&gt;　　　　　　&lt;/StudentInfo&gt;&lt;br&gt;　　　　　　&lt;TestResultCount&gt;3&lt;/TestResultCount&gt;&lt;br&gt;　　　　　　&lt;ScoreAverage&gt;89.50&lt;/ScoreAverage&gt;&lt;br&gt;　　　&lt;/Student&gt;&lt;br&gt;&lt;/Students&gt;&#039;;&lt;br&gt;&lt;br&gt;WITH XMLNAMESPACES (DEFAULT &#039;https://sql55.com/Schemas/Students&#039;)  &lt;br&gt;SELECT	T.C.value(&#039;@ID&#039;, &#039;INT&#039;) AS StudentID,&lt;br&gt;	T.C.value(&#039;(StudentInfo/FirstName)[1]&#039;, &#039;NVARCHAR(MAX)&#039;) AS FirstName,&lt;br&gt;	T.C.value(&#039;(StudentInfo/LastName)[1]&#039;, &#039;NVARCHAR(MAX)&#039;) AS LastName,&lt;br&gt;	T.C.value(&#039;TestResultCount[1]&#039;, &#039;INT&#039;) AS TestResultCount,&lt;br&gt;	T.C.value(&#039;ScoreAverage[1]&#039;, &#039;DECIMAL(5,2)&#039;) AS ScoreAverage&lt;br&gt;FROM	@XMLData2.nodes(&#039;/Students/Student&#039;) AS T(C);&lt;br&gt;&lt;br&gt;WITH XMLNAMESPACES (&#039;https://test.com/Student&#039; AS NS,&lt;br&gt;		　　　 DEFAULT &#039;https://sql55.com/Schemas/Students&#039;)  &lt;br&gt;SELECT	T.C.value(&#039;NS:FirstName[1]&#039;, &#039;NVARCHAR(MAX)&#039;) AS FirstName,&lt;br&gt;	T.C.value(&#039;NS:LastName[1]&#039;, &#039;NVARCHAR(MAX)&#039;) AS LastName,&lt;br&gt;	T.C.value(&#039;NS:Gender[1]&#039;, &#039;NVARCHAR(1)&#039;) AS TestResultCount,&lt;br&gt;	T.C.value(&#039;NS:ScoreAverage[1]&#039;, &#039;DECIMAL(5,2)&#039;) AS ScoreAverage&lt;br&gt;FROM	@XMLData2.nodes(&#039;/Students/NS:Student&#039;) AS T(C);&lt;br&gt;[ 実行結果 ]&lt;br&gt;名前空間が指定された XML からデータを取得する 3&lt;br&gt;&lt;br&gt;&lt;br&gt;一つ目のクエリーはデフォルトの名前空間のみが指定されている時のクエリーと同じです。&lt;br&gt;&lt;br&gt;名前空間の接頭辞がついていない 1 個目と 3 個目の Student 要素の値のみが取得されます。 2 個目の Student は名前空間がマッチしないので取得されません。&lt;br&gt;&lt;br&gt;&lt;br&gt;二つ目のクエリーは WITH XMLNAMESPACES で、名前空間を二つ指定しています。 AS NS の NS 部分はエイリアスなので他の文字でも大丈夫です。&lt;br&gt;&lt;br&gt;XQuery のパス式を指定する際に ns1: の接頭辞のついている要素には NS: を指定します。&lt;br&gt;&lt;br&gt;@XMLData2.nodes(&#039;/Students/NS:Student&#039;) で NS の名前空間の Student 要素を行セットとして取得しています。&lt;br&gt;&lt;br&gt;&#039;https://test.com/Student&#039; 名前空間に属する、2 個目の Student 要素の値のみが取得されていますね。</description><pubDate>Fri, 13 Dec 2019 17:40:00 GMT</pubDate><category>便利なT-SQL＆クエリー集</category></item>
<item><title>T-SQL クエリーで XML をテーブル形式に変換する</title><link>https://sql55.com/query/t-sql-get-table-from-xml.php</link><description>T-SQL クエリーで XML をテーブル形式に変換する&lt;br&gt; 0   0 　　　　&lt;br&gt;&lt;br&gt; &lt;br&gt;T-SQL クエリーで XML をテーブル形式に変換する&lt;br&gt;T-SQL クエリーで XML からデータを取得する方法は何通りかありますが、今回は XML の文字列をテーブル形式に変換する方法のひとつをご紹介します。&lt;br&gt;&lt;br&gt;&lt;br&gt;XML データ型のメソッド&lt;br&gt;SQL Server には XML データ型メソッドというものがあり、XML 型の変数や XML 型のカラムに入っているデータに対して実行でき、ノードや値を取得したり編集したりできます。&lt;br&gt;&lt;br&gt;XML データ型メソッドには query()、value()、exist()、modify()、nodes() などがありますが、今回は value() と nodes() を使って、XML の文字列をテーブル形式に変換します。&lt;br&gt;&lt;br&gt;value() は value(XQuery, SQLType) のように使用し、XQuery のパス式で指定した値を SQL 型に変換して返します。&lt;br&gt;&lt;br&gt;nodes() は nodes(XQuery) AS Table(Column) のように使用し、ノードを XQuery で指定した行セットとして返します。&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;XML をテーブル形式に変換する&lt;br&gt;では、value() と nodes() を使って、XML をテーブル形式に変換してみましょう。&lt;br&gt;&lt;br&gt;次のような、学生情報の XML があります。&lt;br&gt;&lt;br&gt;&lt;Students&gt;&lt;br&gt;　　　&lt;Student ID=&quot;1&quot;&gt;&lt;br&gt;　　　　　　&lt;StudentInfo&gt;&lt;br&gt;　　　　　　　　　&lt;FirstName&gt;Saki&lt;/FirstName&gt;&lt;br&gt;　　　　　　　　　&lt;LastName&gt;Suzuki&lt;/LastName&gt;&lt;br&gt;　　　　　　&lt;/StudentInfo&gt;&lt;br&gt;　　　　　　&lt;TestResultCount&gt;2&lt;/TestResultCount&gt;&lt;br&gt;　　　　　　&lt;ScoreAverage&gt;92.00&lt;/ScoreAverage&gt;&lt;br&gt;　　　&lt;/Student&gt;&lt;br&gt;　　　&lt;Student ID=&quot;2&quot;&gt;&lt;br&gt;　　　　　　&lt;StudentInfo&gt;&lt;br&gt;　　　　　　　　　&lt;FirstName&gt;Miki&lt;/FirstName&gt;&lt;br&gt;　　　　　　　　　&lt;LastName&gt;Sato&lt;/LastName&gt;&lt;br&gt;　　　　　　&lt;/StudentInfo&gt;&lt;br&gt;　　　　　　&lt;TestResultCount&gt;3&lt;/TestResultCount&gt;&lt;br&gt;　　　　　　&lt;ScoreAverage&gt;89.50&lt;/ScoreAverage&gt;&lt;br&gt;　　　&lt;/Student&gt;&lt;br&gt;&lt;/Students&gt;&lt;br&gt;これの XML をテーブル形式にするクエリーは以下の通りです。&lt;br&gt;&lt;br&gt;DECLARE @XMLString XML = &lt;br&gt;&#039;&lt;Students&gt;&lt;br&gt;　　　&lt;Student ID=&quot;1&quot;&gt;&lt;br&gt;　　　　　　&lt;StudentInfo&gt;&lt;br&gt;　　　　　　　　　&lt;FirstName&gt;Saki&lt;/FirstName&gt;&lt;br&gt;　　　　　　　　　&lt;LastName&gt;Suzuki&lt;/LastName&gt;&lt;br&gt;　　　　　　&lt;/StudentInfo&gt;&lt;br&gt;　　　　　　&lt;TestResultCount&gt;2&lt;/TestResultCount&gt;&lt;br&gt;　　　　　　&lt;ScoreAverage&gt;92.00&lt;/ScoreAverage&gt;&lt;br&gt;　　　&lt;/Student&gt;&lt;br&gt;　　　&lt;Student ID=&quot;2&quot;&gt;&lt;br&gt;　　　　　　&lt;StudentInfo&gt;&lt;br&gt;　　　　　　　　　&lt;FirstName&gt;Miki&lt;/FirstName&gt;&lt;br&gt;　　　　　　　　　&lt;LastName&gt;Sato&lt;/LastName&gt;&lt;br&gt;　　　　　　&lt;/StudentInfo&gt;&lt;br&gt;　　　　　　&lt;TestResultCount&gt;3&lt;/TestResultCount&gt;&lt;br&gt;　　　　　　&lt;ScoreAverage&gt;89.50&lt;/ScoreAverage&gt;&lt;br&gt;　　　&lt;/Student&gt;&lt;br&gt;&lt;/Students&gt;&#039;;&lt;br&gt;&lt;br&gt;SELECT	T.C.value(&#039;@ID&#039;, &#039;INT&#039;) AS StudentID,&lt;br&gt;	T.C.value(&#039;(StudentInfo/FirstName)[1]&#039;, &#039;NVARCHAR(MAX)&#039;) AS FirstName,&lt;br&gt;	T.C.value(&#039;(StudentInfo/LastName)[1]&#039;, &#039;NVARCHAR(MAX)&#039;) AS LastName,&lt;br&gt;	T.C.value(&#039;TestResultCount[1]&#039;, &#039;INT&#039;) AS TestResultCount,&lt;br&gt;	T.C.value(&#039;ScoreAverage[1]&#039;, &#039;DECIMAL(5,2)&#039;) AS ScoreAverage&lt;br&gt;FROM	@XMLString.nodes(&#039;/Students/Student&#039;) AS T(C);&lt;br&gt;[ 実行結果 ]&lt;br&gt;T-SQL クエリーで XML をテーブル形式に変換する 1&lt;br&gt;&lt;br&gt;&lt;br&gt;DECLARE @XMLString XML = &#039;XML文字列&#039;&lt;br&gt;&lt;br&gt;まず、@XMLString という名前の XML 型の変数を定義して、先ほどの　XML 文字列を代入します。&lt;br&gt;&lt;br&gt;XML 文字列のフォーマットが正しくない (invalid な) 時は、値を XML 型の変数に代入した時にエラーになりますのでご注意ください。&lt;br&gt;&lt;br&gt;&lt;br&gt;FROM @XMLString.nodes(&#039;/Students/Student&#039;) AS T(C);&lt;br&gt;&lt;br&gt;FROM の @XMLString.nodes(&#039;/Students/Student&#039;) で、XML の /Students/Student の階層で行セットが返るように指定しています。&lt;br&gt;&lt;br&gt;それに続く AS T(C) の T(C) は新しい行セットにアクセスする際のエイリアスなので、他の文字でも大丈夫です。&lt;br&gt;&lt;br&gt;その行セットに対して、 SELECT で T.C.value(XQuery, SQLType) を使って値を取得していきます。&lt;br&gt;&lt;br&gt;&lt;br&gt;SELECT T.C.value(&#039;@ID&#039;, &#039;INT&#039;) AS StudentID,&lt;br&gt;&lt;br&gt;XML の 属性 (Attribute) の値を取得したい時は XQuery に パス + @属性名 を指定します。&lt;br&gt;&lt;br&gt;T.C.value(&#039;@ID&#039;, &#039;INT&#039;) では Student の属性 の ID の値を INT 型で取得しています。&lt;br&gt;&lt;br&gt;指定した SQL のデータ型に 変換できない値が入っていると、変換でエラーになりますのでご注意ください。&lt;br&gt;&lt;br&gt;&lt;br&gt;T.C.value(&#039;(StudentInfo/FirstName)[1]&#039;, &#039;NVARCHAR(MAX)&#039;) AS FirstName, ...&lt;br&gt;&lt;br&gt;XML の 要素 (element) の値を取得したい時は XQuery に (パス + 要素名)[1] を指定します。&lt;br&gt;&lt;br&gt;.value() では、XQuery が返す値が 2 個以上の時はエラーになります。&lt;br&gt;&lt;br&gt;実際には、そのパス式の返す値はひとつしかなくても、シングルトンを返すことを明示的に指定しなければならないので [1] をつけています。&lt;br&gt;&lt;br&gt;XQuery で指定した値が存在しない場合でもエラーにはならず、値が NULL になります。</description><pubDate>Thu, 12 Dec 2019 13:51:00 GMT</pubDate><category>便利なT-SQL＆クエリー集</category></item>
<item><title>SQL Server - OUTPUT 句の使い方</title><link>https://sql55.com/query/sql-server-output-clause.php</link><description>SQL Server - OUTPUT 句の使い方&lt;br&gt; &lt;br&gt;SQL Server の OUTPUT 句&lt;br&gt;SQL Server の OUTPUT 句を使うと、INSERT、UPDATE、DELETE、MERGE ステートメントで影響を受けたレコードを取得することができます。&lt;br&gt;&lt;br&gt;トリガーをご存知の方は、トリガーの定義の中で inserted や deleted のカラムにアクセスできると思いますが、同じような感じで値を取得することができます。&lt;br&gt;&lt;br&gt;今回は INSERT、UPDATE、DELETE の際に、影響のあったレコードを取得して、テーブル変数に入れてみましょう。&lt;br&gt;&lt;br&gt; こちら のスクリプトで今回使用するテーブルを生成することができます。&lt;br&gt;&lt;br&gt; &lt;br&gt;INSERT ステートメントで OUTPUT 句を使う&lt;br&gt;まずは INSERT ステートメントで OUTPUT 句を使ってみましょう。&lt;br&gt;&lt;br&gt;次のような Student テーブルにレコードを 2 つ INSERT します。&lt;br&gt;&lt;br&gt;SQL Server - OUTPUT 句の使い方 1&lt;br&gt;&lt;br&gt;SQL Server - OUTPUT 句の使い方 2&lt;br&gt;&lt;br&gt;&lt;br&gt;OUTPUT 句を使って、その時に生成された　IDENTITY カラムの StudentID の値と挿入した FirstName, LastName の値を @StudentInserted という名前のテーブル変数に取得するクエリーは以下の通りです。&lt;br&gt;&lt;br&gt;DECLARE @StudentInserted TABLE (&lt;br&gt;   StudentID INT,&lt;br&gt;   FirstName VARCHAR(50),&lt;br&gt;   LastName VARCHAR(50)&lt;br&gt;);&lt;br&gt;&lt;br&gt;-------------------------------------------&lt;br&gt;&lt;br&gt;INSERT INTO Student&lt;br&gt;   (FirstName, LastName, Gender)&lt;br&gt;OUTPUT &lt;br&gt;   inserted.StudentID, &lt;br&gt;   inserted.FirstName, &lt;br&gt;   inserted.LastName&lt;br&gt;INTO @StudentInserted (&lt;br&gt;   StudentID,&lt;br&gt;   FirstName,&lt;br&gt;   LastName&lt;br&gt;)&lt;br&gt;VALUES &lt;br&gt;   (&#039;Rin&#039;, &#039;Yokota&#039;, &#039;M&#039;),&lt;br&gt;   (&#039;Hina&#039;, &#039;Yokota&#039;, &#039;F&#039;);&lt;br&gt;&lt;br&gt;-------------------------------------------&lt;br&gt;&lt;br&gt;SELECT	*&lt;br&gt;FROM	@StudentInserted;&lt;br&gt;SQL Server - OUTPUT 句の使い方 3&lt;br&gt;&lt;br&gt;SQL Server - OUTPUT 句の使い方 6&lt;br&gt;&lt;br&gt;OUTPUT 句は INSERT INTO と VALUES の間に入ります。&lt;br&gt;&lt;br&gt;INSERT ステートメントでは inserted のカラムプレフィックスを使って、挿入された値を取得することができます。 deleted は使えません。&lt;br&gt;&lt;br&gt;IDENTITY の StudentID カラムのように、直接値を挿入していないカラムからも値を取得できます。&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;UPDATE ステートメントで OUTPUT 句を使う&lt;br&gt;次は UPDATE ステートメントで OUTPUT 句を使ってみましょう。&lt;br&gt;&lt;br&gt;Student テーブルの Gender が M のレコードの LastName を大文字に更新し、影響のあったレコードの変更前後の値を @StudentUpdated という名前のテーブル変数に取得するクエリーは以下の通りです。&lt;br&gt;&lt;br&gt;DECLARE @StudentUpdated TABLE (&lt;br&gt;   StudentID INT,&lt;br&gt;   LastNameFrom VARCHAR(50),&lt;br&gt;   LastNameTo VARCHAR(50)&lt;br&gt;);&lt;br&gt;&lt;br&gt;-------------------------------------------&lt;br&gt;&lt;br&gt;UPDATE	Student&lt;br&gt;SET	LastName = UPPER(LastName)&lt;br&gt;OUTPUT	inserted.StudentID, deleted.LastName, inserted.LastName&lt;br&gt;INTO	@StudentUpdated		&lt;br&gt;WHERE	Gender = &#039;M&#039;;&lt;br&gt;&lt;br&gt;-------------------------------------------&lt;br&gt;&lt;br&gt;SELECT	*&lt;br&gt;FROM	@StudentUpdated;&lt;br&gt;SQL Server - OUTPUT 句の使い方 4&lt;br&gt;&lt;br&gt;SQL Server - OUTPUT 句の使い方 7&lt;br&gt;&lt;br&gt;OUTPUT 句は SET と WHERE (FROM がある時は FROM) の間に入ります。&lt;br&gt;&lt;br&gt;UPDATE ステートメントでは deleted のカラムプレフィックスを使って変更前の値を、inserted のカラムプレフィックスを使って変更後の値を取得することができます。&lt;br&gt;&lt;br&gt;&lt;br&gt;DELETED ステートメントで OUTPUT 句を使う&lt;br&gt;最後に DELETE ステートメントで OUTPUT 句を使ってみましょう。&lt;br&gt;&lt;br&gt;StudentID が 6 より大きいレコードを削除して、削除されたレコードの値を @StudentDeleted という名前のテーブル変数に取得するクエリーは以下の通りです。&lt;br&gt;&lt;br&gt;DECLARE @StudentDeleted TABLE (&lt;br&gt;   StudentID INT,&lt;br&gt;   FirstName VARCHAR(50),&lt;br&gt;   LastName VARCHAR(50)&lt;br&gt;);&lt;br&gt;&lt;br&gt;-------------------------------------------&lt;br&gt;&lt;br&gt;DELETE	S&lt;br&gt;OUTPUT	deleted.StudentID, &lt;br&gt;	deleted.FirstName, &lt;br&gt;	deleted.LastName&lt;br&gt;INTO @StudentDeleted (&lt;br&gt;	StudentID,&lt;br&gt;	FirstName,&lt;br&gt;	LastName&lt;br&gt;	)&lt;br&gt;FROM	Student AS S&lt;br&gt;WHERE	StudentID &gt; 6;&lt;br&gt;&lt;br&gt;-------------------------------------------&lt;br&gt;&lt;br&gt;SELECT	*&lt;br&gt;FROM	@StudentDeleted;&lt;br&gt;SQL Server - OUTPUT 句の使い方 5&lt;br&gt;&lt;br&gt;SQL Server - OUTPUT 句の使い方 8&lt;br&gt;&lt;br&gt;OUTPUT 句は DELETE と FROM table_source の間に入ります。&lt;br&gt;&lt;br&gt;DELETE ステートメントでは deleted のカラムプレフィックスを使って、削除されたレコードの値を取得することができます。 inserted は使えません。&lt;br&gt;&lt;br&gt;&lt;br&gt;今回は取得したデータを後で使う前提で OUTPUT INTO でテーブル変数に値を入れましたが、INTO を指定しなければ OUTPUT で指定したカラムの値がそのまま結果セットとして返ります。&lt;br&gt;&lt;br&gt;なお、OUTPUT 句で取得できる値は INSERT、UPDATE、 DELETE ステートメントが実行された後、トリガーが走る前の値です。&lt;br&gt;&lt;br&gt;対象のテーブルにトリガーがついていて、トリガーが走った後の値が必要な場合は、OUTPUT 句で同時に取得するのではなく、後ほど別途取得してください。</description><pubDate>Wed, 11 Dec 2019 17:15:00 GMT</pubDate><category>便利なT-SQL＆クエリー集</category></item>
<item><title>SQL Server - サイズの大きなスクリプトファイルを実行する方法</title><link>https://sql55.com/column/how-to-execute-large-sql-file.php</link><description>SQL Server - サイズの大きなスクリプトファイルを実行する方法&lt;br&gt; &lt;br&gt;サイズの大きなスクリプトファイル&lt;br&gt;サイズが数ギガあるような SQL スクリプトの入ったファイルは、SQL Server Management Studio で sql ファイルを開こうとしてもエラーになる可能性が高いです。&lt;br&gt;&lt;br&gt;また、サイズの大きなスクリプトファイルを開けても、マシンのスペックにもよりますが、実行するとメモリー不足のエラーになって実行できないこともあります。&lt;br&gt;今回は、サイズの大きなスクリプトファイルを実行する方法をご紹介します。&lt;br&gt;&lt;br&gt;&lt;br&gt;sqlcmd ユーティリティ とは？&lt;br&gt;sqlcmd ユーティリティはコマンドプロンプトから SQL ステートメントやストアードプロシージャなどを実行できるコマンドラインツールです。&lt;br&gt;&lt;br&gt;この、sqlcmd ユーティリティを使うと、SQL Server Management Studio やテキストエディタでは開けないような大きなサイズのスクリプトファイルも実行することができます。&lt;br&gt;&lt;br&gt; sqlcmd ユーティリティは SQL Server をインストールした時にデフォルトでインストールされていると思いますが、インストールされていない方はマイクロソフトの 「sqlcmd ユーティリティ」 のページからダウンロードできます。&lt;br&gt;URL は変更されるかもしれないので、site:docs.microsoft.com &quot;sqlcmd ユーティリティ&quot; で検索してみてください。 サイズの大きなスクリプトファイルを実行する方法 4&lt;br&gt;&lt;br&gt; &lt;br&gt;sqlcmd ユーティリティ を使ってファイルを実行する&lt;br&gt;Windows のスタートメニューからコマンドプロンプトを開き、sqlcmd コマンドを実行します。&lt;br&gt;&lt;br&gt;sqlcmd -S [サーバー] -U [ログイン名] -P [パスワード] -i [入力ファイル] -u -o [出力ファイル]&lt;br&gt;&lt;br&gt;今回指定するオプションは次のものです。&lt;br&gt;&lt;br&gt;-S: サーバー（/デフォルトインスタンスではない場合はインスタンス名）&lt;br&gt;-U: ログイン名&lt;br&gt;-P: パスワード&lt;br&gt;-i: 入力ファイル名&lt;br&gt;-u: 出力ファイル Unicode で生成する&lt;br&gt;-o: 出力ファイル名&lt;br&gt;-S の指定がない時は、ローカルにインストールされたデフォルトインスタスに接続されます。&lt;br&gt;&lt;br&gt;今回は実行結果をファイルに出力しますが、もし実行結果をコマンドラインで見たい時は、-u と -o オプションを削除すれば、コマンドラインに表示されます。&lt;br&gt;&lt;br&gt;-u を指定しないと出力ファイル内の日本語が文字化けしてしまいますのでご注意ください。&lt;br&gt;&lt;br&gt;また、スクリプト内に USE ステートメントがなく、データベースも指定してスクリプトを実行したい時は -d　[データベース名] で指定してください。&lt;br&gt;&lt;br&gt;&lt;br&gt;例えば、sqlcmd ユーティリティを使って、D:\Temp\Sql\scripts.sql という名前のスクリプトが入ったファイルを、ローカル(.)にインストールされている MSSQLSERVER2017 という名前付きインスタンスに対して実行し、実行結果を D:\Temp\Sql\result.txt に保存するコマンドは以下の通りです。&lt;br&gt;&lt;br&gt;sqlcmd -S .\MSSQLSERVER2017 -U user2 -P Password -i D:\Temp\Sql\scripts.sql -u -o D:\Temp\Sql\result.txt&lt;br&gt;サイズの大きなスクリプトファイルを実行する方法 1&lt;br&gt;&lt;br&gt;コマンドを実行すると、SQL Server に対してスクリプトが実行され、このように result.txt ファイルが出力されました。&lt;br&gt;&lt;br&gt;サイズの大きなスクリプトファイルを実行する方法 2&lt;br&gt;&lt;br&gt;サイズの大きなスクリプトファイルを実行する方法 3&lt;br&gt;&lt;br&gt;&lt;br&gt;最後に、sqlcmd ユーティリティをコマンドラインから実行すると ODBC を使用してスクリプトを実行します。&lt;br&gt;&lt;br&gt;SQL Server Management Studio は SqlClient を使用してスクリプトを実行しますので、デフォルトのオプションの違いなどで、同じクエリーを実行しても少し違った動きをする可能性もなくはないので、お知らせしておきます。&lt;br&gt;&lt;br&gt;</description><pubDate>Thu, 05 Dec 2019 17:54:00 GMT</pubDate><category>SQL Server＆T-SQLに関するコラム</category></item>
<item><title>SQL Server データベースをシングルユーザー(Single User)モードから通常のマルチユーザーモードに戻す方法</title><link>https://sql55.com/column/set-database-from-single-user-mode-to-multi-user-mode.php</link><description>SQL Server データベースをシングルユーザー(Single User)モードから通常のマルチユーザーモードに戻す方法&lt;br&gt; &lt;br&gt;SQL Server データベースのシングルユーザーモード&lt;br&gt;SQL Server データベースをシングルユーザー(Single User)モードにすると、そのデータベースに一度に一人のユーザーしかアクセスできなくなります。&lt;br&gt;&lt;br&gt;SINGLE_USER モードから MULTI_USER モードに戻す方法 1&lt;br&gt;&lt;br&gt;例えば、シングルユーザーモードで既に他のユーザーがアクセスしているデータベースに対してクエリーを実行すると、次のようなエラーになります。&lt;br&gt;&lt;br&gt;Msg 924, Level 14, State 1, Line 2 データベース &#039;Test&#039; は既に開かれています。同時に 1 人のユーザーだけが開けます。&lt;br&gt;&lt;br&gt;SINGLE_USER モードから MULTI_USER モードに戻す方法 2&lt;br&gt;&lt;br&gt;今回はシングルユーザー(SINGLE_USER)モードから通常のマルチユーザー(MULTI_USER)モードに戻す方法をご紹介します。&lt;br&gt;&lt;br&gt;&lt;br&gt;マルチユーザー(MULTI_USER)モードに変更する&lt;br&gt;まず、SQL Server データベースをマルチユーザー(MULTI_USER)モードに変更するスクリプトは以下の通りです。&lt;br&gt;&lt;br&gt;実行中のトランザクションがあればロールバックされます。&lt;br&gt;&lt;br&gt;USE master;&lt;br&gt;GO&lt;br&gt;&lt;br&gt;ALTER DATABASE [DatabaseName]&lt;br&gt;SET MULTI_USER&lt;br&gt;WITH ROLLBACK IMMEDIATE;&lt;br&gt;ただ、他のユーザーがそのデータベースに既にアクセスしている場合、以下のようなエラーになります。&lt;br&gt;&lt;br&gt;Msg 5064, Level 16, State 1, Line 4 この時点では、データベース &#039;Test&#039; の状態やオプションを変更できません。データベースはシングル ユーザー モードで、現在ユーザーが接続中です。 Msg 5069, Level 16, State 1, Line 4 ALTER DATABASE ステートメントが失敗しました。&lt;br&gt;&lt;br&gt;SINGLE_USER モードから MULTI_USER モードに戻す方法 3&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;データベースにアクセスしているプロセスを探す&lt;br&gt;マルチユーザー(MULTI_USER)モードに変更するスクリプトを実行する為に、現在ターゲットのデータベースにアクセスしているプロセスのセッション ID を探し出して、強制終了します。&lt;br&gt;&lt;br&gt;データベースにアクセスしているプロセスのセッション ID を探すクエリーには次のようなものがあります。&lt;br&gt;&lt;br&gt;-------------------------------------&lt;br&gt;SELECT	request_session_id,&lt;br&gt;	* &lt;br&gt;FROM	sys.dm_tran_locks &lt;br&gt;WHERE	resource_database_id = DB_ID(&#039;DatabaseName&#039;);&lt;br&gt;-------------------------------------&lt;br&gt;SELECT	*&lt;br&gt;FROM	sys.sysprocesses &lt;br&gt;WHERE	dbid = DB_ID(&#039;DatabaseName&#039;);&lt;br&gt;-------------------------------------&lt;br&gt;DECLARE @sp_who_result TABLE (&lt;br&gt;	spid		SMALLINT,&lt;br&gt;	ecid		SMALLINT,&lt;br&gt;	status		NCHAR(30),&lt;br&gt;	loginame	NCHAR(128),&lt;br&gt;	hostname	NCHAR(128),&lt;br&gt;	blk		CHAR(5),&lt;br&gt;	dbname		NCHAR(128),&lt;br&gt;	cmd		NCHAR(16),&lt;br&gt;	request_id	INT&lt;br&gt;);&lt;br&gt;&lt;br&gt;INSERT INTO @sp_who_result&lt;br&gt;	EXEC sp_who;&lt;br&gt;&lt;br&gt;SELECT	*&lt;br&gt;FROM	@sp_who_result&lt;br&gt;WHERE	dbname = &#039;DatabaseName&#039;;&lt;br&gt;-------------------------------------&lt;br&gt;SINGLE_USER モードから MULTI_USER モードに戻す方法 4&lt;br&gt;&lt;br&gt;sys.dm_tran_locks は現在アクティブなロックマネージャーリソースの情報を返すシステムビューです。 request_session_id カラムの値がセッション ID です。&lt;br&gt;&lt;br&gt;sys.sysprocesses は実行されているプロセスの情報を返すシステムビューです。 spid カラムの値がセッション ID です。&lt;br&gt;&lt;br&gt;sp_who は、現在のユーザー、セッション、プロセスなどの情報を返すシステムストアードプロシージャです。 こちらも spid カラムの値がセッション ID です。&lt;br&gt;&lt;br&gt;どの結果も待機中などのプロセスも含まれます。 スクリーンショットのケースでは 56 にブロックされて 66 は待機状態でなので、セッションID 56 がシングルユーザーモードでアクセスしているセッション ID ですね。&lt;br&gt;&lt;br&gt;&lt;br&gt;アクセスしているプロセスを強制終了する&lt;br&gt;アクセスしているプロセスのセッション ID を見つけたら、以下のクエリーを使って、そのプロセスを強制終了します。&lt;br&gt;&lt;br&gt;KILL [Session ID];&lt;br&gt;SINGLE_USER モードから MULTI_USER モードに戻す方法 5&lt;br&gt;&lt;br&gt;その後、再度マルチユーザー(MULTI_USER)モードに変更するスクリプトを実行すると、マルチユーザー(MULTI_USER)モードに変更できました。&lt;br&gt;&lt;br&gt;USE master;&lt;br&gt;GO&lt;br&gt;&lt;br&gt;ALTER DATABASE Test&lt;br&gt;SET MULTI_USER&lt;br&gt;WITH ROLLBACK IMMEDIATE;&lt;br&gt;SINGLE_USER モードから MULTI_USER モードに戻す方法 6&lt;br&gt;&lt;br&gt;SINGLE_USER モードから MULTI_USER モードに戻す方法 7</description><pubDate>Fri, 22 Nov 2019 13:57:00 GMT</pubDate><category>SQL Server＆T-SQLに関するコラム</category></item>
<item><title>SQL Server データベースを復元しています (Restoring...) 状態から元に戻す方法</title><link>https://sql55.com/column/how-to-get-out-of-restoring-state.php</link><description>SQL Server データベースを復元しています (Restoring...) 状態から元に戻す方法&lt;br&gt; &lt;br&gt;SQL Server データベースが復元しています (Restoring...) 状態&lt;br&gt;SQL Server データベースが 「復元しています...」 (Restoring...) 状態になると、そのデータベースが使えない状態になります。&lt;br&gt;&lt;br&gt;今回は SQL Server データベースが復元しています(Restoring...) 状態になってしまう主な原因と、なってしまった時に通常のオンライン状態に戻す方法をご紹介します。&lt;br&gt;&lt;br&gt;SQL Server データベースを復元しています (Restoring...) 状態から元に戻す方法 1&lt;br&gt;&lt;br&gt;目次&lt;br&gt;1. 復元しています(Restoring...) 状態はどんな時になる？&lt;br&gt;1-1. NORECOVERY オプションで RESTORE DATABASE を実行した時&lt;br&gt;1-2. NORECOVERY オプションで BACKUP LOG を実行した時&lt;br&gt;1-3. 再起動時にトランザクションが正常に終了しなかった時&lt;br&gt;2. 復元しています (Restoring...) 状態から元に戻す方法&lt;br&gt;復元しています... (Restoring...) 状態はどんな時になる？&lt;br&gt;SQL Server のデータベースが復元しています... (Restoring...) 状態になる原因はいろいろありますが、代表的なものをいくつかご紹介します。&lt;br&gt;&lt;br&gt;NORECOVERY オプションでRESTORE DATABASE を実行した時&lt;br&gt;データベースのバックアップファイルをリストアする際に NORECOVERY オプションを付けてリストアすると、データベースは 「復元しています...」 状態になります。&lt;br&gt;&lt;br&gt;SQL Server Management Studio からの場合、以下のように [データベース復元] &gt; [オプション] 画面の [復旧状態] で RESTORE WITH NORECOVERY を選んでリストアを実行した時などに起こります。&lt;br&gt;&lt;br&gt;SQL Server データベースを復元しています (Restoring...) 状態から元に戻す方法 2&lt;br&gt;&lt;br&gt;デフォルトの RESTORE WITH RECOVERY では、コミットされていないトランザクションはロールバックされてリストアされ、データベースはリストア後、使用可能な状態になります。&lt;br&gt;&lt;br&gt;RESTORE WITH NORECOVERY では、コミットされていないトランザクションはロールバックされず、データベースはリストア後、「復元しています...」 状態になります。 通常、他のトランザクションログを続けてリストアする時に指定します。&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;NORECOVERY オプションでBACKUP LOG を実行した時&lt;br&gt;NORECOVERY オプションをつけてログをバックアップした時にも、対象のデータベースが復元しています (Restoring...) 状態になります。&lt;br&gt;&lt;br&gt;これが起こりそうなのは、SQL Server Management Studio から[データベース復元] &gt; [全般] 画面のソースでデバイスからではなくデータベースを選択し、データベースのコピーを作ろうとした時です。&lt;br&gt;&lt;br&gt;SQL Server データベースを復元しています (Restoring...) 状態から元に戻す方法 3&lt;br&gt;&lt;br&gt;&lt;br&gt;[データベース復元] &gt; [オプション] 画面の [ログ末尾のバックアップ] の「復元の前にログ末尾のバックアップを実行する」と「ソースデータベースを復元中の状態にしておく」が下の画面のようにデフォルトでオンになる時があり、そのままリストアを実行し、リストアが何らかの理由で失敗した時に、ソースデータベースが復元しています (Restoring...) 状態になる可能性があります。&lt;br&gt;&lt;br&gt;SQL Server データベースを復元しています (Restoring...) 状態から元に戻す方法 4&lt;br&gt;&lt;br&gt;&lt;br&gt;また、転送先データベースも復元プランによって、先ほどの RESTORE DATABASE を WITH NORECOVERY オプションで実行した後に失敗すれば、復元しています (Restoring...) 状態になる可能性があります。&lt;br&gt;&lt;br&gt; ソースデータベースにも影響が出る可能性があるので、本番環境用のデータベースのコピーを作りたいだけの時は、ソースはデータベースではなく、バックアップファイルを使ってデバイスからリストアすることをお勧めします。&lt;br&gt;&lt;br&gt;再起動時にトランザクションが正常に終了しなかった時&lt;br&gt;まれに長いトランザクション処理の途中で SQL Server がシャットダウンや再起動してしまい、正常に終了できなかったような時に、再起動後にデータベースが復元しています (Restoring...) 状態になることもあります。&lt;br&gt;&lt;br&gt;&lt;br&gt;復元しています (Restoring...) 状態から元に戻す方法&lt;br&gt;まず、トランザクションログなどをリストアしている途中なのであれば、最後のログをリストアする時に WITH RECOVERY オプションで実行すると通常の状態になりますので、リストアを続けてください。&lt;br&gt;&lt;br&gt;復元しています (Restoring...)状態から、通常のアクセスできる状態に戻るスクリプトは次の通りです。&lt;br&gt;&lt;br&gt; ログなどをリストアする必要もなく、ただ単純に復元しています (Restoring...)状態を通常の状態に戻したい時にお使いください。WITH RECOVERY オプションで RESTORE DATABASE を実行すると、コミットされていないトランザクションはロールバックされます。&lt;br&gt;USE master;&lt;br&gt;GO&lt;br&gt;&lt;br&gt;RESTORE DATABASE [DatabaseName] WITH RECOVERY;&lt;br&gt;SQL Server データベースを復元しています (Restoring...) 状態から元に戻す方法 5&lt;br&gt;&lt;br&gt;完全バックアップファイルをリストアする時に WITH NORECOVERY で実行してしまったのであれば、もう一度リストアを WITH RECOVERY で実行しても通常の状態に戻ります。</description><pubDate>Sun, 17 Nov 2019 20:31:00 GMT</pubDate><category>SQL Server＆T-SQLに関するコラム</category></item>
<item><title>データベース内の全ユーザー定義関数を取得する</title><link>https://sql55.com/query/list-all-user-defined-functions.php</link><description>データベース内の全ユーザー定義関数を取得する　&lt;br&gt;&lt;br&gt; &lt;br&gt;データベース内の全ユーザー定義関数を取得するには？&lt;br&gt;今回はデータベース内の全ユーザー定義関数の一覧を取得したい時使えるスクリプトをご紹介します。&lt;br&gt;&lt;br&gt;方法は何通りかありますが、ここではシンプルにユーザー定義関数の名前のリストを取得したいので sys.objects と INFORMATION_SCHEMA.ROUTINES を使うクエリーを載せておきます。&lt;br&gt;&lt;br&gt;&lt;br&gt;sys.objects を使って全ユーザー定義関数を取得する&lt;br&gt;まず、sys.objects　というスキーマスコープのユーザー定義オブジェクトを返すシステムカタログビューを使った方法です。&lt;br&gt;&lt;br&gt;sys.objects を使って全ユーザー定義関数を取得するクエリーは次の通りです。&lt;br&gt;&lt;br&gt;SELECT	SCHEMA_NAME(schema_id) AS SchemaName,&lt;br&gt;	name AS FunctionName,&lt;br&gt;	type AS FunctionType,&lt;br&gt;	type_desc AS FunctionTypeDesc&lt;br&gt;FROM	sys.objects&lt;br&gt;WHERE	type IN (&#039;AF&#039;,&#039;FN&#039;,&#039;FS&#039;,&#039;FT&#039;,&#039;IF&#039;,&#039;TF&#039;)&lt;br&gt;ORDER BY SchemaName,&lt;br&gt;	 FunctionName;&lt;br&gt;データベース内の全ユーザー定義関数を取得する 1&lt;br&gt;&lt;br&gt;sys.objects はユーザー定義関数以外のオブジェクトも含むので、type を指定してフィルターしています。&lt;br&gt;&lt;br&gt;指定しているユーザー定義関数の type は以下のものです。&lt;br&gt;&lt;br&gt;AF: CLR 集計関数&lt;br&gt;FN: SQL スカラー関数&lt;br&gt;FS: CLR スカラー関数&lt;br&gt;FT: CLR テーブル値関数&lt;br&gt;IF: SQL インラインテーブル値関数&lt;br&gt;TF: SQL テーブル値関数&lt;br&gt;&lt;br&gt; &lt;br&gt;INFORMATION_SCHEMA.ROUTINES を使って全ユーザー定義関数を取得する&lt;br&gt;次は、システムインフォメーションスキーマビュー の ROUTINES を使って全ユーザー定義関数を取得する方法です。&lt;br&gt;&lt;br&gt;INFORMATION_SCHEMA.ROUTINES は現在のデータベースで現在のユーザーがアクセスできるストアードプロシージャとファンクションを返してくれるビューです。&lt;br&gt;&lt;br&gt;INFORMATION_SCHEMA.ROUTINES を使って全ユーザー定義関数を取得するクエリーは次の通りです。&lt;br&gt;&lt;br&gt;SELECT	ROUTINE_SCHEMA,&lt;br&gt;	ROUTINE_NAME&lt;br&gt;FROM	INFORMATION_SCHEMA.ROUTINES&lt;br&gt;WHERE	ROUTINE_TYPE = &#039;FUNCTION&#039;&lt;br&gt;ORDER BY ROUTINE_SCHEMA,&lt;br&gt;	 ROUTINE_NAME;&lt;br&gt;データベース内の全ユーザー定義関数を取得する 2&lt;br&gt;&lt;br&gt;ROUTINE_TYPE はストアードプロシージャは PROCEDURE、ファンクションは FUNCTION なので、FUNCTION でフィルターしています。&lt;br&gt;&lt;br&gt; マイクロソフトのサイトに、INFORMATION_SCHEMA ビューで取得できるスキーマをあてにしないように注意書きがされています。 信用できるスキーマを取得したい時は sys.objects のほうを使ってください。&lt;br&gt;&lt;br&gt;ユーザー定義関数の定義を取得する&lt;br&gt;おまけですが、ユーザー定義関数の定義の内容も取得したい時は、CLR 以外は以下のクエリーで取得できます。&lt;br&gt;&lt;br&gt;SELECT	SCHEMA_NAME(O.schema_id) AS SchemaName,&lt;br&gt;	O.name AS FunctionName,&lt;br&gt;	O.type AS FunctionType,&lt;br&gt;	O.type_desc AS FunctionTypeDesc,&lt;br&gt;	M.definition AS FunctionDefinition&lt;br&gt;FROM	sys.objects AS O&lt;br&gt;	   LEFT JOIN sys.sql_modules AS M&lt;br&gt;	      ON O.object_id = M.object_id&lt;br&gt;WHERE	O.type IN (&#039;AF&#039;,&#039;FN&#039;,&#039;FS&#039;,&#039;FT&#039;,&#039;IF&#039;,&#039;TF&#039;)&lt;br&gt;ORDER BY SchemaName,&lt;br&gt;	 FunctionName;&lt;br&gt;データベース内の全ユーザー定義関数を取得する 3&lt;br&gt;&lt;br&gt;CLR ユーザー定義関数の FunctionDefinition は NULL になります。&lt;br&gt;&lt;br&gt;&lt;br&gt;どれも、現在のユーザーがアクセスできるユーザー定義関数しか取得できませんので、権限のあるユーザーでログインして実行してくださいね！</description><pubDate>Thu, 07 Nov 2019 17:49:00 GMT</pubDate><category>便利なT-SQL＆クエリー集</category></item>
<item><title>SQL Server: 検証されていない not trusted の CHECK 制約や FOREIGN KEY 制約を trusted にする方法</title><link>https://sql55.com/column/not-trusted-check-constraints-and-foreign-keys.php</link><description>SQL Server: 検証されていない not trusted の CHECK 制約や FOREIGN KEY 制約を trusted にする方法&lt;br&gt; &lt;br&gt;検証されていない (not trusted) とはどういう状態？&lt;br&gt;CHECK 制約 と FOREIGN KEY 制約のオブジェクトカタログビューには、制約をシステムが検証したかどうかを示す is_not_trusted というフラグがあります。&lt;br&gt;&lt;br&gt;この is_not_trusted が 1 の時には、実際に制約違反の値があるかどうかに関わらず、制約はシステムに検証されていないというステータスになっています。&lt;br&gt;&lt;br&gt;is_not_trusted が 1 だと、SQL Server が実行プランを生成する際に、せっかくの制約が活用されません。&lt;br&gt;&lt;br&gt;今回は検証されていない状態の CHECK 制約 と FOREIGN KEY 制約を、検証された状態 (is_not_trusted = 0) に戻す方法をご説明します。&lt;br&gt;&lt;br&gt;&lt;br&gt;検証されていない CHECK 制約 と FOREIGN KEY 制約を探す&lt;br&gt;検証されてない (is_not_trusted = 1) の CHECK 制約 と FOREIGN KEY 制約を探すクエリーは以下の通りです。&lt;br&gt;&lt;br&gt;SELECT	SCHEMA_NAME(C.schema_id) AS SchemaName,&lt;br&gt;	O.name AS TableName,&lt;br&gt;	C.name AS CheckConstraintName,&lt;br&gt;	C.is_not_trusted&lt;br&gt;FROM	sys.check_constraints AS C&lt;br&gt;	   INNER JOIN sys.objects AS O&lt;br&gt;	      ON C.parent_object_id = O.object_id&lt;br&gt;WHERE	C.is_not_trusted = 1&lt;br&gt;	AND C.is_disabled = 0&lt;br&gt;	AND C.is_not_for_replication = 0;&lt;br&gt;検証されていない not trusted の CHECK 制約 1&lt;br&gt;&lt;br&gt;SELECT	SCHEMA_NAME(F.schema_id) AS SchemaName,&lt;br&gt;	O.name AS TableName,&lt;br&gt;	F.name AS ForeignKeyName,&lt;br&gt;	F.is_not_trusted&lt;br&gt;FROM	sys.foreign_keys AS F&lt;br&gt;	   INNER JOIN sys.objects AS O&lt;br&gt;	      ON F.parent_object_id = O.object_id&lt;br&gt;WHERE	F.is_not_trusted = 1&lt;br&gt;	AND F.is_disabled = 0&lt;br&gt;	AND F.is_not_for_replication = 0;&lt;br&gt;無効化されている制約は対象から除いています。&lt;br&gt;&lt;br&gt;is_not_for_replication = 1 の制約は is_not_trusted が 1 になり、検証された trusted 状態にできないので、こちらも対象から除いています。&lt;br&gt;&lt;br&gt; 意図的ではなく is_not_for_replication = 1 になってしまっている場合は、一度、制約を DROP して NOT FOR REPLICATION のオプションなしで制約を作り直してください。&lt;br&gt;&lt;br&gt; &lt;br&gt;検証された状態 is_not_trusted = 0 に変更するクエリー&lt;br&gt;先ほどのスクリプトで検証されていない状態になってしまっている制約を見つけたら、以下のクエリーを使って trusted の状態に変更します。&lt;br&gt;&lt;br&gt;ALTER TABLE [テーブル名] WITH CHECK CHECK CONSTRAINT [制約名];&lt;br&gt;&lt;br&gt;CHECK CONSTRAINT の前に WITH CHECK をつけることで、システムが既存の値を検証し、全ての値が制約に合っている場合は is_not_trusted が 0 に変更されます。&lt;br&gt;&lt;br&gt;is_not_trusted = 0 に変更するクエリー&lt;br&gt;&lt;br&gt;&lt;br&gt;制約違反の値が存在する場合は上記のクエリーを実行すると以下のようなエラーになります。&lt;br&gt;&lt;br&gt;ALTER TABLE ステートメントは CHECK 制約 &quot;制約名&quot; と競合しています。競合が発生したのは、データベース &quot;データベース名&quot;、テーブル &quot;テーブル名&quot;, column &#039;カラム名&#039; です。&lt;br&gt;&lt;br&gt;is_not_trusted = 0 に変更するクエリーのエラー&lt;br&gt;&lt;br&gt;値を制約に合ったものに変更して、再度実行してください。&lt;br&gt;&lt;br&gt;&lt;br&gt;is_not_trusted = 1 になる原因は？&lt;br&gt;is_not_trusted が 1 になってしまう原因でよくあるのが、一時的に制約を無効な状態にして、データを投入したりした後で、有効にする際に以下のスクリプトで有効化してしまうケースです。&lt;br&gt;&lt;br&gt;ダメ  ALTER TABLE [テーブル名] CHECK CONSTRAINT [制約名];&lt;br&gt;&lt;br&gt;有効化はされますが、is_not_trusted が 1 になります。&lt;br&gt;&lt;br&gt;新しい値にのみ制約を有効にしたいような特別な状況では仕方がないかもしれませんが、それ以外の状況では忘れずに WITH CHECK をつけて制約を有効化してください。&lt;br&gt;&lt;br&gt;他には、制約のついたテーブルに BULK INSERT をする際に CHECK_CONSTRAINTS のオプションを指定せずにデータをインサートした時にも is_not_trusted が 1 になりますのでご注意ください。</description><pubDate>Sun, 03 Nov 2019 19:16:00 GMT</pubDate><category>SQL Server＆T-SQLに関するコラム</category></item>
<item><title>パラメーターの既定値 (Default) のあるユーザー定義関数を実行する際の注意点</title><link>https://sql55.com/column/udf-with-default-value-parameter.php</link><description>T-SQL: パラメーターの既定値 (Default) のあるユーザー定義関数を実行する際の注意点&lt;br&gt; 0   0 　　　　&lt;br&gt;&lt;br&gt; &lt;br&gt;パラメーターの既定値 (Default)&lt;br&gt;ストアードプロシージャやユーザー定義関数に、デフォルトの入力引数（インプットパラメーター）を設定したいような時ありますよね。&lt;br&gt;&lt;br&gt;ストアードプロシージャとユーザー定義関数では、デフォルトの指定の仕方は同じですが、呼び出す際の方法が違います。&lt;br&gt;&lt;br&gt;パラメーターの既定値 (Default)の定義方法とその実行方法について、見てみましょう。&lt;br&gt;&lt;br&gt;&lt;br&gt;パラメーターの既定値 (Default)を定義する方法&lt;br&gt;デフォルトの値を定義するには、引数を定義した後ろに続けて = [既定値] のように指定します。&lt;br&gt;&lt;br&gt;例えば次のような感じです。&lt;br&gt;&lt;br&gt;[ユーザー定義関数の例]&lt;br&gt;パラメーターの既定値 (Default)を定義する方法 1&lt;br&gt;&lt;br&gt;[ストアードプロシージャの例]&lt;br&gt;パラメーターの既定値 (Default)を定義する方法 2&lt;br&gt;&lt;br&gt;上の例では、実行時に 2 個目の引数である @Input2 に値が渡された時は、その渡された値が使われ、渡されなかった場合は 2 が使われます。&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;パラメーターの既定値のあるストアードプロシージャを実行する方法&lt;br&gt;ストアードプロシージャとユーザー定義関数では、デフォルト値の定義の方法は同じでしたが、デフォルト値を使って実行する際の方法が違います。&lt;br&gt;&lt;br&gt;パラメーターの既定値のあるストアードプロシージャは次のように実行できます。&lt;br&gt;&lt;br&gt;パラメーターの既定値のあるユーザー定義関数を実行する方法 3&lt;br&gt;&lt;br&gt;上の二つは @Input2 に 5 を指定して実行しているので、結果は 6 になっています。&lt;br&gt;&lt;br&gt;下の二つは @Input2 を指定せずに実行しているおんで、デフォルト値の 2 が使われ、結果は 3 になっていますね。&lt;br&gt;&lt;br&gt;&lt;br&gt;パラメーターの既定値のあるユーザー定義関数を実行する方法&lt;br&gt;次に、パラメーターの既定値のあるユーザー定義関数を実行する方法です。&lt;br&gt;&lt;br&gt;デフォルト値を使わないで、@Input1 と @Input2 の両方を指定して実行する方法は次の通りです。&lt;br&gt;&lt;br&gt;パラメーターの既定値のあるユーザー定義関数を実行する方法 4&lt;br&gt;&lt;br&gt;&lt;br&gt;デフォルト値を使って実行する際ですが、ストアードプロシージャの時の感じで省略してしまうと、次のように 「プロシージャまたは関数 * に指定された引数が不足しています。」 というエラーになります。&lt;br&gt;&lt;br&gt;パラメーターの既定値のあるユーザー定義関数を実行する方法 5&lt;br&gt;&lt;br&gt;&lt;br&gt;ユーザー定義関数で、デフォルト値を使って実行したい時は、DEFAULT というキーワードを指定しなければなりません。&lt;br&gt;&lt;br&gt;パラメーターの既定値のあるユーザー定義関数を実行する方法 6&lt;br&gt;&lt;br&gt;ストアードプロシージャと違うので、後でユーザー定義関数に引数を追加することになった時などに、デフォルト値を指定しても、呼ぶ側の変更も必要になるので注意してください。&lt;br&gt;&lt;br&gt;&lt;br&gt;DEFAULT を指定せずにデフォルト値を使ってユーザー定義関数を実行する方法&lt;br&gt;私はあまりこの形でユーザー定義関数を使う機会がないのですが、DEFAULT を指定せずにデフォルト値を使ってユーザー定義関数を実行することも可能です。&lt;br&gt;&lt;br&gt;EXEC を使って次のようにユーザー定義関数を実行すると、DEFAULT というキーワードを指定せずにデフォルト値を使うことができます。&lt;br&gt;&lt;br&gt;パラメーターの既定値のあるユーザー定義関数を実行する方法 7</description><pubDate>Thu, 26 Sep 2019 21:28:00 GMT</pubDate><category>SQL Server＆T-SQLに関するコラム</category></item>
<item><title>T-SQL で 文字列 NVARCHAR を一文字ずつに分割した列にする方法</title><link>https://sql55.com/query/split-nvarchar-into-rows-of-character.php</link><description>T-SQL で 文字列 NVARCHAR を一文字ずつに分割した列にする方法&lt;br&gt; 0    0 　　　　&lt;br&gt;&lt;br&gt; &lt;br&gt;文字列を一文字ずつに分割したい&lt;br&gt;クエリーで NVARCHAR 型などの文字列を一文字ずつに分解して、バリデーションや変換などを行いたいような時はないでしょうか。&lt;br&gt;&lt;br&gt;文字列を一文字ずつに分割する方法には、素直にループして取り出していく方法や SQL Server の他のオブジェクトを使って番号テーブルを生成して使用する方法など、いろんな方法があります。&lt;br&gt;&lt;br&gt;ここでは、ループをしないでお手軽に使えるクエリーをご紹介します。&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;共通テーブル式 (CTE) を使って、文字列を一文字ずつに分割する&lt;br&gt;ループをせずに文字列を分割する為には、1, 2, 3, 4, ... と数字が入った番号テーブルが必要になります。&lt;br&gt;&lt;br&gt;その番号テーブルを共通テーブル式 (CTE) を使って生成し、文字列を一文字ずつに分割するクエリーは以下の通りです。&lt;br&gt;&lt;br&gt;DECLARE @Memo NVARCHAR(MAX) = N&#039;これはメモです。 ABC&#039;;&lt;br&gt;&lt;br&gt;;WITH SeqNoCTE (SeqNo) AS&lt;br&gt;(&lt;br&gt;   SELECT 1&lt;br&gt;   UNION ALL &lt;br&gt;   SELECT SeqNo + 1 &lt;br&gt;   FROM	  SeqNoCTE&lt;br&gt;   WHERE  SeqNo &lt; LEN(@Memo)&lt;br&gt;)&lt;br&gt;SELECT	S.SeqNo,&lt;br&gt;	M.Char1&lt;br&gt;FROM	SeqNoCTE AS S&lt;br&gt;	   CROSS APPLY &lt;br&gt;	      (SELECT SUBSTRING(@Memo, S.SeqNo, 1) AS Char1) AS M&lt;br&gt;ORDER BY S.SeqNo;&lt;br&gt;T-SQL で 文字列 NVARCHAR を一文字ずつに分割した列にする方法 1&lt;br&gt;&lt;br&gt;まず、緑に囲まれた部分で、1 ~ [文字の長さ] までの番号の入った SeqNo カラムを持つ、SeqNoCTE を生成しています。&lt;br&gt;&lt;br&gt;そこの部分だけを取り出して実行するとこんな感じです。&lt;br&gt;&lt;br&gt;T-SQL で 文字列 NVARCHAR を一文字ずつに分割した列にする方法 2&lt;br&gt;&lt;br&gt;これに オレンジで囲まれた部分で CROSS APPLY と SUBSTRING 使って、@Memo の開始位置 SeqNo から 1 文字分を取得しています。&lt;br&gt;&lt;br&gt;JOIN では右側のテーブルソースに、左側のテーブルソースの値を使用することはできないので、APPLY 演算子を使うことによって SeqNo を右側のテーブルソースに渡して使用しています。</description><pubDate>Thu, 29 Aug 2019 21:04:00 GMT</pubDate><category>便利なT-SQL＆クエリー集</category></item>
<item><title>SQL Server 構成マネージャー (SQL Server Configuration Manager) の起動方法</title><link>https://sql55.com/sql-server/how-to-open-sql-server-configuration-manager.php</link><description>SQL Server 構成マネージャー (SQL Server Configuration Manager) の起動方法&lt;br&gt;&lt;br&gt;SQL Server 構成マネージャー (SQL Server Configuration Manager) が見つからない！&lt;br&gt;SQL Server 構成マネージャー (SQL Server Configuration Manager) は SQL Server のサービスやネットワーク等の管理をするのに必須なツールです。&lt;br&gt;&lt;br&gt;その、SQL Server 構成マネージャーですが、昔は個別のプログラムだったので、スタートメニューから比較的簡単に探すことができました。&lt;br&gt;&lt;br&gt;最近の Windows では、Microsoft 管理コンソールプログラムのスナップインとして作られている為、スタート画面の検索で 「SQL Server 構成マネージャー」 や 「SQL Server Configuration Manager」 のように名前を入れても、プログラムが出てこなくなりました。&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;SQL Server 構成マネージャー (SQL Server Configuration Manager) の起動方法&lt;br&gt;SQL Server 構成マネージャーを開くには、まずスタート画面で、開きたいバージョンの msc ファイルの名前を入力します。&lt;br&gt;&lt;br&gt;SQL Server 2017	SQLServerManager14.msc&lt;br&gt;SQL Server 2016	SQLServerManager13.msc&lt;br&gt;SQL Server 2014 (12.x)	SQLServerManager12.msc&lt;br&gt;SQL Server 2012 (11.x)	SQLServerManager11.msc&lt;br&gt;&lt;br&gt;例えば、SQL Server 2017 の SQL Server 構成マネージャーを開くには、「 SQLServerManager14.msc 」 と入力します。&lt;br&gt;&lt;br&gt;そして、出てきた msc ファイルをクリックすると、SQL Server 構成マネージャー (SQL Server Configuration Manager) が開きます。&lt;br&gt;&lt;br&gt;SQL Server 構成マネージャー (SQL Server Configuration Manager) の起動方法 1&lt;br&gt;&lt;br&gt;&lt;br&gt;上記の msc ファイルは C:\Windows\SysWOW64 にありますので、スタート画面を使わず、msc ファイルを直接起動しても OK です。&lt;br&gt;&lt;br&gt;SQL Server 構成マネージャー (SQL Server Configuration Manager) の起動方法 2&lt;br&gt;&lt;br&gt;SQL Server 構成マネージャーをよく使う方は、ここで msc を右クリックし、スタート画面やタスクバーにピン留めしておくと便利です。&lt;br&gt;&lt;br&gt;SQL Server 構成マネージャー (SQL Server Configuration Manager) の起動方法 3</description><pubDate>Tue, 27 Aug 2019 17:20:00 GMT</pubDate><category>Microsoft SQL Server 入門</category></item>
<item><title>データベース内の全ビュー(view) を取得する</title><link>https://sql55.com/query/list-all-views.php</link><description>データベース内の全ビュー(view) を取得する&lt;br&gt; &lt;br&gt;データベース内の全ビュー(view) を取得するには？&lt;br&gt;データベース内の全ビュー(view) の一覧を取得したり、ビューの名前の一部を指定して検索したりしたいような時があるかもしれません。&lt;br&gt;&lt;br&gt;何通りか方法があるので、今回は、そんな時にに使えるスクリプトをご紹介します。&lt;br&gt;&lt;br&gt;データベース内の全ビュー(view)を取得する&lt;br&gt;まず、sys.views というシステムカタログビューから現在のデータベース内のユーザー定義ビューの一覧を取得することができます。&lt;br&gt;&lt;br&gt;SELECT	OBJECT_SCHEMA_NAME(object_id) AS SchemaName,&lt;br&gt;	name AS ViewName&lt;br&gt;FROM	sys.views&lt;br&gt;ORDER BY OBJECT_SCHEMA_NAME(object_id),&lt;br&gt;	 name;&lt;br&gt;データベース内の全ビュー(view) を取得する 1&lt;br&gt;&lt;br&gt;&lt;br&gt;先ほどの sys.views は、sys.sysobjects というシステムカタログビューの type = &#039;V&#039; の結果に、View 用のカラムを何個か足したものなので、以下のようにしてもビューの一覧を取得することができます。&lt;br&gt;&lt;br&gt;SELECT	OBJECT_SCHEMA_NAME(object_id) AS SchemaName,&lt;br&gt;	name AS ViewName&lt;br&gt;FROM	sys.objects&lt;br&gt;WHERE	type = &#039;V&#039;&lt;br&gt;ORDER BY OBJECT_SCHEMA_NAME(object_id),&lt;br&gt;	 name;&lt;br&gt;データベース内の全ビュー(view) を取得する 2&lt;br&gt;&lt;br&gt;&lt;br&gt;他には、INFORMATION_SCHEMA.VIEWS というシステムインフォメーションスキーマービューでも、ユーザー定義のビューの一覧を取得できます。&lt;br&gt;&lt;br&gt;SELECT	*&lt;br&gt;FROM	INFORMATION_SCHEMA.VIEWS&lt;br&gt;ORDER BY TABLE_CATALOG,&lt;br&gt;	 TABLE_SCHEMA,&lt;br&gt;	 TABLE_NAME;&lt;br&gt;データベース内の全ビュー(view) を取得する 3&lt;br&gt;&lt;br&gt;&lt;br&gt;また、INFORMATION_SCHEMA.TABLES というシステムインフォメーションスキーマービューの TABLE_TYPE = &#039;VIEW&#039; でも取得できます。&lt;br&gt;&lt;br&gt;SELECT	*&lt;br&gt;FROM	INFORMATION_SCHEMA.TABLES&lt;br&gt;WHERE	TABLE_TYPE =&#039;VIEW&#039;&lt;br&gt;ORDER BY TABLE_CATALOG,&lt;br&gt;	 TABLE_SCHEMA,&lt;br&gt;	 TABLE_NAME;&lt;br&gt;データベース内の全ビュー(view) を取得する 4&lt;br&gt;&lt;br&gt;&lt;br&gt;おまけに、現在のデータベースのユーザー定義ビュー + システムビューを取得したい場合は、sys.all_views を使って取得可能です。&lt;br&gt;&lt;br&gt;SELECT	OBJECT_SCHEMA_NAME(object_id) AS ObjectName,&lt;br&gt;	name AS ViewName&lt;br&gt;FROM	sys.all_views&lt;br&gt;ORDER BY OBJECT_SCHEMA_NAME(object_id),&lt;br&gt;	 name;&lt;br&gt;データベース内の全ビュー(view) を取得する 5&lt;br&gt;&lt;br&gt;&lt;br&gt;いろいろありますが、View のスキーマと名前だけが必要な時はどれを使っても良いと思います。 残りのカラムが違いますので、必要に応じて確認してください。&lt;br&gt;&lt;br&gt;どの方法でも、現在のユーザーにパーミッションがある view しか取得できませんので、十分権限のあるユーザーでログインして実行してくださいね！</description><pubDate>Fri, 26 Jul 2019 18:03:00 GMT</pubDate><category>便利なT-SQL＆クエリー集</category></item>
<item><title>T-SQL 入門 - SQL Server の APPLY オペレータ</title><link>https://sql55.com/t-sql/sql-server-apply-operator.php</link><description>SQL Server の APPLY オペレータ&lt;br&gt;SQL Server には SELECT や UPDATE などの FROM 句で使える APPLY というオペレータがあります。&lt;br&gt;&lt;br&gt;APPLY には CROSS APPLY と OUTER APPLY があり、機能的には INNER JOIN と LEFT JOIN に似ています。&lt;br&gt;&lt;br&gt;ユーザー定義のテーブル値関数と結合して、結果セットを返したいような時に便利です。&lt;br&gt;&lt;br&gt;次のように、JOIN だと、右側のテーブル ソース（サブクエリー）に左側のテーブルソースのカラムを含めることができませんが、APPLY オペレーターを使うと左側のカラムを、右側に渡すことができます。&lt;br&gt;&lt;br&gt;SQL Server の APPLY オペレータ 5&lt;br&gt;&lt;br&gt;&lt;br&gt;サンプルデータとユーザー定義のテーブル値関数&lt;br&gt;CROSS APPLY と OUTER APPLY を使うためのサンプルデータを準備します。&lt;br&gt;&lt;br&gt;学生とテストの成績のデータを保存した、次のような Student、Test、TestResult テーブルがあります。&lt;br&gt;&lt;br&gt;SQL Server の APPLY オペレータ 1&lt;br&gt;&lt;br&gt; こちら のスクリプトを実行するとサンプルテーブル＆データを生成できます。&lt;br&gt;「 ユーザー定義のテーブル値関数を作成する 」 のページで作った StudentID を受け取って、テストレポートの結果セットを返す ufnStudentTestReportGet というユーザー定義のテーブル値関数を使います。&lt;br&gt;&lt;br&gt;SQL Server の APPLY オペレータ 2&lt;br&gt;&lt;br&gt;&lt;br&gt;CROSS APPLY&lt;br&gt;まずは CROSS APPLY を使ってみましょう。&lt;br&gt;&lt;br&gt;Student テーブルと ユーザー定義のテーブル値関数 ufnStudentTestReportGet を CROSS APPLY でつなげて結果セットを取得します。&lt;br&gt;&lt;br&gt;その際に CROSS APPLY を使うと、ufnStudentTestReportGet からレコードが返ってこない　Student は結果セットに含まれません。&lt;br&gt;&lt;br&gt;SELECT	S.StudentID,&lt;br&gt;	S.FirstName,&lt;br&gt;	S.LastName,&lt;br&gt;	TR.TestID,&lt;br&gt;	TR.TestName,&lt;br&gt;	TR.Score,&lt;br&gt;	TR.TestAvgScore&lt;br&gt;FROM	Student AS S&lt;br&gt;	   CROSS APPLY dbo.ufnStudentTestReportGet(S.StudentID) AS TR&lt;br&gt;ORDER BY S.StudentID,&lt;br&gt;	 TR.TestID;&lt;br&gt;SQL Server の APPLY オペレータ 3&lt;br&gt;&lt;br&gt;&lt;br&gt;OUTER APPLY&lt;br&gt;次に、Student テーブルと ユーザー定義のテーブル値関数 ufnStudentTestReportGet を OUTER APPLY でつなげて結果セットを取得してみます。&lt;br&gt;&lt;br&gt;SELECT	S.StudentID,&lt;br&gt;	S.FirstName,&lt;br&gt;	S.LastName,&lt;br&gt;	TR.TestID,&lt;br&gt;	TR.TestName,&lt;br&gt;	TR.Score,&lt;br&gt;	TR.TestAvgScore&lt;br&gt;FROM	Student AS S&lt;br&gt;	   OUTER APPLY dbo.ufnStudentTestReportGet(S.StudentID) AS TR&lt;br&gt;ORDER BY S.StudentID,&lt;br&gt;	 TR.TestID;&lt;br&gt;SQL Server の APPLY オペレータ 4&lt;br&gt;&lt;br&gt;OUTER APPLY を使うと、ufnStudentTestReportGet からレコードが返ってこない　Student も結果セットに含まれます。&lt;br&gt;&lt;br&gt;LEFT JOIN みたいな感じですね！&lt;br&gt;&lt;br&gt;</description><pubDate>Thu, 27 Jun 2019 17:27:00 GMT</pubDate><category>T-SQL 入門</category></item>
<item><title>T-SQL - LIKE を使ってアンダースコア(_)やパーセント(%)を含む文字列を探す方法</title><link>https://sql55.com/query/t-sql-how-to-search-for-underscore-percent.php</link><description>T-SQL - LIKE を使ってアンダースコア(_)やパーセント(%)を含む文字列を探す方法&lt;br&gt; 0    0 　　　　&lt;br&gt;&lt;br&gt; &lt;br&gt;LIKE オペレーターとワイルドカード&lt;br&gt;SELECT 文を書く時に、WHERE 句で LIKE オペレーターを使って、特定の文字やパターンを含む値を持つレコードを取得する機会があると思います。&lt;br&gt;&lt;br&gt;LIKE オペレーターでは、いくつかの文字はワイルドカードとして扱われます。&lt;br&gt;&lt;br&gt;&lt;br&gt;パーセント(%) ワイルドカード&lt;br&gt;パーセント(%)は 「 0 個以上の何らかの文字列 」という意味のワイルドカードです。&lt;br&gt;&lt;br&gt;前方一致で条件をしたい時は検索したい文字列の後に、部分一致にしたい時は前後に % をつけることでその文字列を含む値を持つレコードを検索することができます。&lt;br&gt;&lt;br&gt;次のような Student テーブルがあります。&lt;br&gt;&lt;br&gt;LIKE を使ってアンダースコア(_)やパーセント(%)を含む文字列を探す方法 1&lt;br&gt;&lt;br&gt;LastName が Ta で始まる学生のレコードは次のように取得できますね。&lt;br&gt;&lt;br&gt;SELECT * FROM Student WHERE LastName LIKE &#039;Ta%&#039;;&lt;br&gt;LIKE を使ってアンダースコア(_)やパーセント(%)を含む文字列を探す方法 2&lt;br&gt;&lt;br&gt;&lt;br&gt;アンダースコア(_) ワイルドカード&lt;br&gt;アンダースコア(_)は 「 1 個の何らかの文字列 」という意味のワイルドカードです。&lt;br&gt;&lt;br&gt;例えば、LastName の 2 文字目が a の学生のレコードは次のように取得できます。&lt;br&gt;&lt;br&gt;SELECT * FROM Student WHERE LastName LIKE &#039;_a%&#039;;&lt;br&gt;LIKE を使ってアンダースコア(_)やパーセント(%)を含む文字列を探す方法 3&lt;br&gt;&lt;br&gt;&lt;br&gt;アンダースコア(_)やパーセント(%)を含む文字列を探す&lt;br&gt;ここからが本題ですが、LIKE オペレーターを使って、アンダースコア(_)やパーセント(%)を含む文字列を探したい時は、ワイルドカードとしての役割をしないような形で指定しなければなりません。&lt;br&gt;&lt;br&gt;アンダースコア(_)やパーセント(%)を含む文字列を探したい時は、[] のワイルドカードを使って指定することができます。&lt;br&gt;&lt;br&gt;[] ワイルドカード は [a] と一文字を指定したり、[abc] のように a,b,c のどれかと指定したり、[a-z] のように範囲を指定して、一文字をマッチさせることのできるワイルドカードです。&lt;br&gt;&lt;br&gt;&lt;br&gt;例えば FirstName にアンダースコアが含まれる学生のレコードを取得したい時には、次のように指定することができます。&lt;br&gt;&lt;br&gt;SELECT * FROM Student WHERE FirstName LIKE &#039;%[_]%&#039;;&lt;br&gt;LIKE を使ってアンダースコア(_)やパーセント(%)を含む文字列を探す方法 4&lt;br&gt;&lt;br&gt;同様に FirstName にパーセントが含まれる学生のレコードを取得したい時には、次のように指定することができます。&lt;br&gt;&lt;br&gt;SELECT * FROM Student WHERE FirstName LIKE &#039;%[%]%&#039;;&lt;br&gt;LIKE を使ってアンダースコア(_)やパーセント(%)を含む文字列を探す方法 5&lt;br&gt;&lt;br&gt;&lt;br&gt;一応、もう一つの方法としては、ESCAPE を使って、ESCAPE 文字を挿入してアンダースコア(_)やパーセント(%)をワイルドカードとしての役割をしないようにすることも可能です。&lt;br&gt;&lt;br&gt;例えば、「|」 という文字を ESCAPE 文字にするのであれば、次のようなクエリーになります。&lt;br&gt;&lt;br&gt;SELECT * FROM Student WHERE FirstName LIKE &#039;%|_%&#039; ESCAPE &#039;|&#039;;&lt;br&gt;&lt;br&gt;SELECT * FROM Student WHERE FirstName LIKE &#039;%|%%&#039; ESCAPE &#039;|&#039;;&lt;br&gt;LIKE を使ってアンダースコア(_)やパーセント(%)を含む文字列を探す方法 6</description><pubDate>Tue, 11 Jun 2019 14:41:00 GMT</pubDate><category>便利なT-SQL＆クエリー集</category></item>
<item><title>T-SQL - 西暦の日付を和暦（元号）の日付に変換するユーザー定義関数</title><link>https://sql55.com/query/t-sql-get-japanese-calendar-era-date.php</link><description>T-SQL - 西暦の日付を和暦（元号）の日付に変換するユーザー定義関数&lt;br&gt; 0    0 　　　　&lt;br&gt;&lt;br&gt; &lt;br&gt;西暦の日付を和暦（元号）の日付に変換する&lt;br&gt;西暦の日付を和暦（元号）の日付に変換したいような時はないでしょうか。&lt;br&gt;&lt;br&gt;.NET Framework のライブラリーには JapaneseCalendar クラスがあって、GetEra(DateTime) メソッドなどで元号の情報を取得できますが、SQL Server にはそのような便利な組み込み関数はありません。&lt;br&gt;&lt;br&gt;SQL Server の CLR 関数を作成するという手もあるかもしれませんが、頻繁に変わる情報でもないので、元号のテーブル変数を含む西暦の日付を和暦（元号）の日付に変換するユーザー定義関数を作ってみました。&lt;br&gt;&lt;br&gt;難しいことは何もしていないですが、どなたかの参考になれば幸いです。&lt;br&gt;&lt;br&gt;&lt;br&gt;西暦の日付を和暦（元号）の日付に変換するユーザー定義関数&lt;br&gt;まずは、元号一覧用に JapaneseEra テーブルを作って、データをインサートしておきます。&lt;br&gt;&lt;br&gt;CREATE TABLE JapaneseEra (&lt;br&gt;   EraValue TINYINT NOT NULL PRIMARY KEY,&lt;br&gt;   EraName NVARCHAR(2) NOT NULL,&lt;br&gt;   EraAbbreviation CHAR(1) NOT NULL,&lt;br&gt;   EraStartDate DATE NOT NULL,&lt;br&gt;   EraEndDate DATE NOT NULL&lt;br&gt;);&lt;br&gt;&lt;br&gt;INSERT INTO JapaneseEra&lt;br&gt;   (EraValue, EraName, EraAbbreviation, EraStartDate, EraEndDate)&lt;br&gt;VALUES &lt;br&gt;   (1, N&#039;明治&#039;, &#039;M&#039;, &#039;1868-09-08&#039;, &#039;1912-07-29&#039;),&lt;br&gt;   (2, N&#039;大正&#039;, &#039;T&#039;, &#039;1912-07-30&#039;, &#039;1926-12-24&#039;),&lt;br&gt;   (3, N&#039;昭和&#039;, &#039;S&#039;, &#039;1926-12-25&#039;, &#039;1989-01-07&#039;),&lt;br&gt;   (4, N&#039;平成&#039;, &#039;H&#039;, &#039;1989-01-08&#039;, &#039;2019-04-30&#039;),&lt;br&gt;   (5, N&#039;令和&#039;, &#039;R&#039;, &#039;2019-05-01&#039;, &#039;9999-12-31&#039;);&lt;br&gt;西暦の日付を和暦（元号）の日付に変換するユーザー定義関数 1&lt;br&gt;&lt;br&gt;西暦の日付を和暦（元号）の日付に変換するユーザー定義関数 2&lt;br&gt;&lt;br&gt;取得時のパフォーマンスを考えて、開始日だけではなく終了日の値も必須項目として、令和の終了日は DATE の最大値を設定しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;そして、西暦の日付を和暦（元号）の日付に変換するユーザー定義関数は以下の通りです。&lt;br&gt;&lt;br&gt;CREATE FUNCTION ufnGetEraDate (&lt;br&gt;   @InputDate DATE&lt;br&gt;)&lt;br&gt;RETURNS NVARCHAR(50)&lt;br&gt;AS&lt;br&gt;BEGIN&lt;br&gt;&lt;br&gt;   DECLARE @EraDate NVARCHAR(50);&lt;br&gt;&lt;br&gt;   DECLARE @EraName NVARCHAR(2),&lt;br&gt;           @EraYear TINYINT;&lt;br&gt;&lt;br&gt;   SELECT  @EraName = EraName,&lt;br&gt;           @EraYear = DATEDIFF(yy, EraStartDate, @InputDate) + 1&lt;br&gt;   FROM    JapaneseEra WITH (NOLOCK)&lt;br&gt;   WHERE   @InputDate BETWEEN EraStartDate AND EraEndDate;&lt;br&gt;&lt;br&gt;   SET @EraDate = @EraName&lt;br&gt;                  + CASE &lt;br&gt;                     WHEN @EraYear = 1&lt;br&gt;                        THEN N&#039;元&#039;&lt;br&gt;                        ELSE N&#039; &#039; + CAST(@EraYear AS NVARCHAR) + N&#039; &#039;&lt;br&gt;                     END &lt;br&gt;                  + N&#039;年&#039;&lt;br&gt;                  + FORMAT(@InputDate, N&#039; M 月 d 日&#039;);&lt;br&gt;&lt;br&gt;   RETURN @EraDate;&lt;br&gt;&lt;br&gt;END&lt;br&gt;西暦の日付を和暦（元号）の日付に変換するユーザー定義関数 3&lt;br&gt;&lt;br&gt;@InputDate に西暦の日付を渡し、JapaneseEra テーブルから年号の情報を取得して、和暦の日付を作って返します。&lt;br&gt;&lt;br&gt;日付が明治より前の年号の日付の場合は NULL が返ります。&lt;br&gt;&lt;br&gt; FORMAT 関数は SQL Server 2012 以降でサポートされている組み込み関数です。 SQL Server 2012 より前の SQL Server をお使いの場合は、FORMAT(@InputDate, N&#039; M 月 d 日&#039;) の代わりに例えば以下のような感じで、@InputDate から月と日を取り出して文字列を作ってください。 &lt;br&gt;N&#039; &#039; + CAST(MONTH(@InputDate) AS NVARCHAR(2)) + N&#039; 月 &#039; &lt;br&gt;+ CAST(DAY(@InputDate) AS NVARCHAR(2)) + N&#039; 日&#039;&lt;br&gt;&lt;br&gt;こんな感じで使うことができます。&lt;br&gt;&lt;br&gt;西暦の日付を和暦（元号）の日付に変換するユーザー定義関数 4&lt;br&gt;&lt;br&gt;西暦の日付を和暦（元号）の日付に変換するユーザー定義関数 5</description><pubDate>Mon, 06 May 2019 21:18:00 GMT</pubDate><category>便利なT-SQL＆クエリー集</category></item>
<item><title>T-SQL でカラム名（列名）を変更する方法</title><link>https://sql55.com/query/how-to-rename-column.php</link><description>T-SQL でカラム名（列名）を変更する方法&lt;br&gt; 0    0 　　　　&lt;br&gt;&lt;br&gt; &lt;br&gt;SQL Server のテーブルのカラム名を変更する&lt;br&gt;テーブルのカラム名の変更は、SQL Server Management Studio のオブジェクトエクスプローラからできますが、システムのデプロイ時など、スクリプトで変更したい時もあると思います。&lt;br&gt;&lt;br&gt;今回の記事は SQL Server のテーブルのカラム名（列名）を変更する方法についてです。&lt;br&gt;&lt;br&gt;&lt;br&gt;[名前の変更] でカラム名を変更する&lt;br&gt;まずは、みなさんご存知かもしれませんが、SQL Server Management Studio のオブジェクトエクスプローラからカラム名を変更する方法です。&lt;br&gt;&lt;br&gt;SQL Server Management Studio のオブジェクトエクスプローラで、変更したい データベース &gt; テーブル &gt; カラムを選択します。&lt;br&gt;&lt;br&gt;右クリックし [名前の変更] をするか、カラムをもう一度クリックすると、カラム名が変更できるようになるので、新しいカラム名を入力します。&lt;br&gt;&lt;br&gt;T-SQL でカラム名（列名）を変更する方法 1&lt;br&gt;&lt;br&gt;T-SQL でカラム名（列名）を変更する方法 2&lt;br&gt;&lt;br&gt;新しい名前を入力したら、フォーカスをはずすとカラム名が変更されます。&lt;br&gt;&lt;br&gt;&lt;br&gt;デザイン画面でカラム名を変更する&lt;br&gt;もうひとつ、SQL Server Management Studio からカラム名を変更する方法です。&lt;br&gt;&lt;br&gt;SQL Server Management Studio のオブジェクトエクスプローラで、変更したい データベース &gt; テーブル で右クリックし [デザイン]　を選択します。&lt;br&gt;&lt;br&gt;T-SQL でカラム名（列名）を変更する方法 3&lt;br&gt;&lt;br&gt;テーブルのデザイン画面が出てくるので、カラム名を変更して保存すると、カラム名が変更されます。&lt;br&gt;&lt;br&gt;T-SQL でカラム名（列名）を変更する方法 4&lt;br&gt;&lt;br&gt;&lt;br&gt;Transact-SQL でカラム名を変更する&lt;br&gt;最後に、T-SQL でカラム名を変更する方法です。&lt;br&gt;&lt;br&gt;sp_rename という名前のシステムストアードプロシージャを使います。&lt;br&gt;&lt;br&gt;カラム名を変更するスクリプトは次の通りです。&lt;br&gt;&lt;br&gt;EXEC sp_rename &#039;スキーマ名.テーブル名.現在のカラム名&#039;, &#039;新しいカラム名&#039;, &#039;COLUMN&#039;;&lt;br&gt;&lt;br&gt;例えば、このスクリプトを実行すれば、Student テーブルの LastName カラムを LastNameEN というカラム名に変更できます。&lt;br&gt;&lt;br&gt;EXEC sp_rename &#039;dbo.Student.LastName&#039;, &#039;LastNameEN&#039;, &#039;COLUMN&#039;;&lt;br&gt;T-SQL でカラム名（列名）を変更する方法 5&lt;br&gt;&lt;br&gt;リフレッシュすると、カラム名が変更されていますね。&lt;br&gt;&lt;br&gt;T-SQL でカラム名（列名）を変更する方法 6&lt;br&gt;&lt;br&gt;&lt;br&gt;スクリプト実行時の注意メッセージにも書かれていますが、どの方法でカラム名を変更しても、このカラムが使われている箇所まで変更してくれる訳ではありません。&lt;br&gt;&lt;br&gt;カラム名を変更する際には、使われている箇所の変更もれがないように気をつけてくださいね！</description><pubDate>Fri, 12 Apr 2019 20:35:00 GMT</pubDate><category>便利なT-SQL＆クエリー集</category></item>
<item><title>SQL Server で一時テーブルを使う時のちょっとした注意点</title><link>https://sql55.com/column/temporary-tables-with-same-name.php</link><description>SQL Server で一時テーブルを使う時のちょっとした注意点&lt;br&gt; 0    0 　　　　&lt;br&gt;&lt;br&gt; &lt;br&gt;SQL Server の一時テーブル&lt;br&gt;SQL Server の一時テーブルには、テーブル名が ## で始まるグローバル一時テーブルと # で始まるローカル一時テーブルがあります。&lt;br&gt;&lt;br&gt;今回はローカル一時テーブルをストアードプロシージャ内で使う際の、ちょっとした注意点を取り上げます。&lt;br&gt;&lt;br&gt;&lt;br&gt;SQL Server のローカル一時テーブル&lt;br&gt;ローカル一時テーブルは、同じセッション内のみ有効なテーブルで、普通のテーブルと同様に CREATE TABLE や SELECT INTO などのステートメントで作成することができます。&lt;br&gt;&lt;br&gt;実際には、ローカル一時テーブルの場合は SQL Server がわかるように名前を変更して tempdb に生成されています。&lt;br&gt;&lt;br&gt;&lt;br&gt;例えば、#Test という名前のローカル一時テーブルを作ると、次のような感じで tempdb に生成されます。&lt;br&gt;&lt;br&gt;SQL Server で一時テーブルを使う時のちょっとした注意点　1&lt;br&gt;&lt;br&gt;SQL Server で一時テーブルを使う時のちょっとした注意点　2&lt;br&gt;&lt;br&gt; データ量の多いテーブル達から、複雑なクエリーで一度に値を取得するよりも、一時テーブルに対象となりそうなデータのみを一旦保存して、その一時テーブルに対してクエリーを書いたほうが、処理時間が速くなることが多いです。 クエリーチューニングの際はお試しください。&lt;br&gt;&lt;br&gt;ローカル一時テーブル使う際の注意点&lt;br&gt;まず、同じバッチやストアードプロシージャ内で、同じ名前のローカル一時テーブルを作成しようとするとエラーになります。&lt;br&gt;&lt;br&gt;SQL Server で一時テーブルを使う時のちょっとした注意点　3&lt;br&gt;&lt;br&gt;&lt;br&gt;ローカル一時テーブルは、同じセッション内で有効、と書きましたが、あるストアードプロシージャ A から別のストアードプロシージャ B を実行した時には、A で作成したローカル一時テーブルに B 内で利用できます。&lt;br&gt;&lt;br&gt;例えば、次のようにストアードプロシージャ uspTempTest1 内で作った #Test テーブルを uspTempTest2 で UPDATE することができます。&lt;br&gt;&lt;br&gt;SQL Server で一時テーブルを使う時のちょっとした注意点　4&lt;br&gt;&lt;br&gt;SQL Server で一時テーブルを使う時のちょっとした注意点　5&lt;br&gt;&lt;br&gt;SQL Server で一時テーブルを使う時のちょっとした注意点　6&lt;br&gt;&lt;br&gt; 呼ばれた側のストアードプロシージャだけ見た時に、ローカル一時テーブルがどのように定義されていて何が入っているのかわからないので、あまりおすすめの使い方ではありません。&lt;br&gt;&lt;br&gt;ここからが本題で、ちょっと注意しておいたほうが良い点です。&lt;br&gt;&lt;br&gt;呼ばれる側のストアードプロシージャ内で、同じ名前のローカル一時テーブルを生成してもエラーにはなりません。&lt;br&gt;&lt;br&gt;先ほどの uspTempTest1 はそのままで、uspTempTest2 内で同じ名前で定義が少し違うローカル一時テーブル #Test を作成して SELECT してみましょう。&lt;br&gt;&lt;br&gt;SQL Server で一時テーブルを使う時のちょっとした注意点　7&lt;br&gt;&lt;br&gt;SQL Server で一時テーブルを使う時のちょっとした注意点　8&lt;br&gt;&lt;br&gt;uspTempTest1 を実行するとこのような結果になります。&lt;br&gt;&lt;br&gt;SQL Server で一時テーブルを使う時のちょっとした注意点　9&lt;br&gt;&lt;br&gt;同じ名前のローカル一時テーブルが既に存在していてもエラーにはならず、uspTempTest2 内での SELECT では uspTempTest2 内で作られた #Test が使われていますね。&lt;br&gt;&lt;br&gt;&lt;br&gt;次に、uspTempTest2 で #Test に値を INSERT してみましょう。&lt;br&gt;&lt;br&gt;SQL Server で一時テーブルを使う時のちょっとした注意点　10&lt;br&gt;&lt;br&gt;再度 uspTempTest1 を実行するとこのようなエラーになります。&lt;br&gt;&lt;br&gt;SQL Server で一時テーブルを使う時のちょっとした注意点　11&lt;br&gt;&lt;br&gt;先ほどの SELECT では、uspTempTest2 で生成した #Test が使われていましたが、その真下の INSERT では、uspTempTest1 で生成した #Test が使われた為、TestName というカラムがないというエラーになっています。&lt;br&gt;&lt;br&gt;マイクロソフトによると、このような状況で、同じ名前のローカル一時テーブルが存在している時に、クエリーがどちらの一時テーブルを使うかは定義されていません。 その為、どちらのローカル一時テーブルが使われるかわからないのです。&lt;br&gt;&lt;br&gt;また、このエラーメッセージからでは、ローカル一時テーブルの名前が原因だと特定するのに時間がかかるかもしれません。&lt;br&gt;&lt;br&gt;同じセッション内で、同じ名前のローカル一時テーブルを意図的に複数作りたい状況が思い浮かばないので、CREATE でエラーが出てくれたらわかりやすいのになぁ、と思います。&lt;br&gt;&lt;br&gt;複数人数で開発していて、自分の作ったストアードプロシージャを他の人が作ったストアードプロシージャから実行したり、されたりするような場合は、一時テーブルの名前がかぶらないようにご注意くださいね。</description><pubDate>Fri, 22 Mar 2019 23:31:00 GMT</pubDate><category>SQL Server＆T-SQLに関するコラム</category></item>
<item><title>SQL Server が使用しているポートを確認する方法</title><link>https://sql55.com/column/how-to-find-port-used-by-sql-server.php</link><description>SQL Server が使用しているポートを確認する方法&lt;br&gt; 0    0 　　　　&lt;br&gt;&lt;br&gt; &lt;br&gt;SQL Server が使用している TCP/IP ポートを確認する&lt;br&gt;SQL Server のデータベースエンジンが使用する TCP/IP ポート番号は、デフォルトでは以下のようになっています。&lt;br&gt;&lt;br&gt;デフォルトインスタンス： 1433&lt;br&gt;名前付きインスタンス： ダイナミックポート&lt;br&gt;ですが、使用するポート番号は変更・固定可能なので、デフォルトインスタンスでも 1433 でない可能性もあります。&lt;br&gt;&lt;br&gt;今回は、TCP/IP プロトコルが有効化されている前提で、SQL Server が使用しているポートを確認する方法をご紹介します。&lt;br&gt;&lt;br&gt;&lt;br&gt;SQL Server 構成マネージャーで使用しているポートを確認する方法&lt;br&gt;こちらは私の PC の SQL Server 構成マネージャーですが、今回はデフォルトインスタンスの SQL Server(MSSQLSERVER) と、名前付きインスタンスの SQL Server(MSSQLSERVER2017) の使用しているポート番号を確認してみましょう。&lt;br&gt;&lt;br&gt;SQL Server が使用しているポートを確認する方法　1&lt;br&gt;&lt;br&gt;&lt;br&gt;まずはデフォルトインスタンスから確認します。&lt;br&gt;&lt;br&gt;左側の [SQL Server ネットワークの構成] で [MSSQLSERVER のプロトコル] を選択し、右側で [TCP/IP] で右クリックして [プロパティ] を選択します。&lt;br&gt;&lt;br&gt;SQL Server が使用しているポートを確認する方法　2&lt;br&gt;&lt;br&gt;プロトコルのタブの [Listen All] が　[はい] の時は、IPアドレスタブの一番下の [IPAll] の箇所が有効になっています。&lt;br&gt;&lt;br&gt;SQL Server が使用しているポートを確認する方法　3&lt;br&gt;&lt;br&gt;SQL Server が使用しているポートを確認する方法　4&lt;br&gt;&lt;br&gt;ここで、TCP Port として設定されて番号 (1433) が固定されているポート番号です。&lt;br&gt;&lt;br&gt;SQL Server をスタートする際に、この固定されているポート番号は既に他使われている場合は SQL Server をスタートすることができません。&lt;br&gt;&lt;br&gt;ですので、この値が SQL Server がスタートされた後に変更されたのでなければ、これが現在使用されているポート番号になります。&lt;br&gt;&lt;br&gt;&lt;br&gt;次に、名前付きインスタンスのポート番号を確認してみましょう。&lt;br&gt;&lt;br&gt;先ほどのように、[SQL Server ネットワークの構成] で [MSSQLSERVER2017 のプロトコル] を選択し、右側で [TCP/IP] で右クリックして [プロパティ] を選択します。&lt;br&gt;&lt;br&gt;SQL Server が使用しているポートを確認する方法　5&lt;br&gt;&lt;br&gt;プロトコルのタブの [Listen All] が　[はい] なので、IPアドレスタブの一番下の [IPAll] の箇所を見ます。&lt;br&gt;&lt;br&gt;SQL Server が使用しているポートを確認する方法　6&lt;br&gt;&lt;br&gt;SQL Server が使用しているポートを確認する方法　7&lt;br&gt;&lt;br&gt;今度は TCP Port ではなく、TCP Dynamic Portsにポート番号 (51258) が設定されています。&lt;br&gt;&lt;br&gt;名前付きインスタンスの TCP Dynamic Ports の値はデフォルト 0 （ダイナミックポートを使用するという意味） になっていて、TCP/IP を有効化して SQL　Server を再起動した際に設定されます。&lt;br&gt;&lt;br&gt;SQL Server を開始した際にこのポート番号が他で使われていない限り、ずっとこのポート番号が使われます。&lt;br&gt;&lt;br&gt;もしそのポート番号が空いていない場合は、別のポート番号を使い、TCP Dynamic Ports の値も更新されます。&lt;br&gt;&lt;br&gt;ですので、こちらも、ここで見つけたポート番号が SQL Server がスタートされた後に変更されたのでなければ、これが現在使用されているポート番号になります。&lt;br&gt;&lt;br&gt;&lt;br&gt;SQL Server ログから使用しているポートを確認する方法&lt;br&gt;SQL Server を開始した時に書き出されるログで、listen しているポート番号を確認することもできます。&lt;br&gt;&lt;br&gt;ERRORLOG ファイルをキーワードで検索してもよいですが、以下のクエリーを実行しても確認可能です。&lt;br&gt;&lt;br&gt;xp_readerrorlog 0, 1, N&#039;Server is listening on [ &#039;&#039;any&#039;&#039;&#039;;&lt;br&gt;MSSQLSERVER SQL Server が使用しているポートを確認する方法　8&lt;br&gt;&lt;br&gt;MSSQLSERVER2017 SQL Server が使用しているポートを確認する方法　9&lt;br&gt;&lt;br&gt; この先、SQL Server のログの書き出し方が変わってしまったらこのクエリーでは見つからないかもしれません。 その時は検索するキーワードを変えてみてください。&lt;br&gt;&lt;br&gt;最後に、SQL Server Management Studio から [IPアドレス],[ポート番号] で接続することで、見つけたポート番号が正しいか確認することができます。&lt;br&gt;&lt;br&gt;[例]&lt;br&gt;127.0.0.1,51258&lt;br&gt;localhost,51258&lt;br&gt;&lt;br&gt;SQL Server が使用しているポートを確認する方法　10</description><pubDate>Thu, 07 Mar 2019 02:22:00 GMT</pubDate><category>SQL Server＆T-SQLに関するコラム</category></item>
<item><title>SQL Server - デタッチ＆アタッチでデータベースを移動する方法</title><link>https://sql55.com/column/how-to-move-database-using-detach-and-attach.php</link><description>SQL Server - デタッチ＆アタッチでデータベースを移動する方法&lt;br&gt; &lt;br&gt;SQL Server のデータベースを移動させたい&lt;br&gt;SQL Server の データベースを、同じサーバー内の他のインスタンスや、別のサーバーに移動させたい時ありますよね。&lt;br&gt;&lt;br&gt;バックアップ＆リストアでもデータベースをコピーすることができますが、今回はデタッチ＆アタッチでデータベースを移動する方法をご紹介します。&lt;br&gt;&lt;br&gt; 同じインスタンス内でデータベースファイルの保存場所を変更したい時に、デタッチ＆アタッチでもできなくはないのですが、マイクロソフトは ALTER DATABASE を使う方法を推奨しています。&lt;br&gt;&lt;br&gt;ALTER DATABASE を使ってデータベースファイルの保存場所を変更する方法はこちらです。&lt;br&gt;SQL Server - ログファイルの保存場所を変更する方法&lt;br&gt;&lt;br&gt;デタッチ＆アタッチでデータベースを移動する&lt;br&gt;今回はデフォルトインスタンスにある TestDB というデータベースを、同じサーバー内の名前付きインスタンスに移動させてみましょう。&lt;br&gt;&lt;br&gt;デタッチ＆アタッチでデータベースを移動する方法　1&lt;br&gt;&lt;br&gt;&lt;br&gt;1. まず、でタッチしたいデータベースを選択して右クリックし、[タスク] &gt; [デタッチ] をクリックします。&lt;br&gt;&lt;br&gt;デタッチ＆アタッチでデータベースを移動する方法　2&lt;br&gt;&lt;br&gt;デタッチの画面が出てきます。 アクティブなコネクションがあるとデタッチできないので、メッセージにアクティブな接続出てきた場合は [接続の削除] をチェックして接続を切断するようにして [OK] をクリックします。&lt;br&gt;&lt;br&gt;デタッチ＆アタッチでデータベースを移動する方法　3&lt;br&gt;&lt;br&gt;オブジェクトエクスプローラのデータベースから TestDB が消えました。 消えない場合はリフレッシュボタンをクリックしてみてください。&lt;br&gt;&lt;br&gt;デタッチ＆アタッチでデータベースを移動する方法　4&lt;br&gt;&lt;br&gt;&lt;br&gt;2. TestDB のデータベースファイル (mdf) とログファイル (ldf) を移動します。&lt;br&gt;&lt;br&gt;デタッチ＆アタッチでデータベースを移動する方法　5&lt;br&gt;&lt;br&gt;&lt;br&gt;3. 移動先のインスタンスで [データベース] を選択し、右クリックで [アタッチ] を選択します。&lt;br&gt;&lt;br&gt;デタッチ＆アタッチでデータベースを移動する方法　6&lt;br&gt;&lt;br&gt;アタッチの画面が出てくるので、[追加] をクリックして、データベースファイル (mdf)を選択し、[OK] をクリックします。&lt;br&gt;&lt;br&gt;デタッチ＆アタッチでデータベースを移動する方法　7&lt;br&gt;&lt;br&gt;デタッチ＆アタッチでデータベースを移動する方法　8&lt;br&gt;&lt;br&gt;そうすると、自動的にログファイル (ldf)も選択されるので、[OK] をクリックします。&lt;br&gt;&lt;br&gt;デタッチ＆アタッチでデータベースを移動する方法　9&lt;br&gt;&lt;br&gt; ログファイル (ldf)がない場合、データベースファイル (mdf) だけ指定してもアタッチ可能です。 その場合はアタッチした時に ldf ファイルが生成されます。&lt;br&gt;ここで、SQL Server のサービスアカウントがデータベースファイルにアクセスする権限がない時に以下のようなオペレーティング システム エラー 5: &quot;5(Access is denied.)&quot; が出る可能性があります。&lt;br&gt;&lt;br&gt;デタッチ＆アタッチでデータベースを移動する方法　10&lt;br&gt;&lt;br&gt;そんな時は SQL Server のサービスアカウントを SQL Server 構成マネージャー等で確認して、データベースファイル (mdf) とログファイル (ldf)にアクセス権限を追加してください。&lt;br&gt;&lt;br&gt;デタッチ＆アタッチでデータベースを移動する方法　11&lt;br&gt;&lt;br&gt;デタッチ＆アタッチでデータベースを移動する方法　12&lt;br&gt;&lt;br&gt;アクセス権限を追加した後で再度 [OK] ボタンをクリックすると、TempDB がアタッチされました。&lt;br&gt;&lt;br&gt;デタッチ＆アタッチでデータベースを移動する方法　13</description><pubDate>Fri, 15 Feb 2019 01:40:00 GMT</pubDate><category>SQL Server＆T-SQLに関するコラム</category></item>
<item><title>SQL Server ログ - ERRORLOG ファイルの保存場所</title><link>https://sql55.com/column/how-to-find-error-log-file-location.php</link><description>SQL Server ログ - ERRORLOG ファイルの保存場所&lt;br&gt; 0      0 　　　　&lt;br&gt;&lt;br&gt; &lt;br&gt;SQL Server ログファイルの保存場所はどこ？&lt;br&gt;SQL Server ログは、SQL Server Management Studio のオブジェクトエクスプローラーから [管理] &gt; [SQL Server ログ] で確認できます。&lt;br&gt;&lt;br&gt;SQL Server ログ - ERRORLOG ファイルの保存場所 1&lt;br&gt;&lt;br&gt;ですが、分析したい時など、実際にログが保存されているエラーログファイルを取得したい時もありますよね。&lt;br&gt;&lt;br&gt;&lt;br&gt;SQL Server ログ　- ERRORLOG ファイル&lt;br&gt;この SQL Server ログの内容は、実際には ERRORLOG や ERRORLOG.[番号] という名前で保存されています。&lt;br&gt;&lt;br&gt;SQL Server ログ - ERRORLOG ファイルの保存場所 2&lt;br&gt;&lt;br&gt;通常、SQL Server のインスタンスが開始される度に新しいログファイルが作られます。&lt;br&gt;&lt;br&gt;ERRORLOG が最新のもので、ERRORLOG.1 が次に新しいもの、ERRORLOG.2 がその次というように、最大 6 個まで過去のエラーログファイルが保存されています。&lt;br&gt;&lt;br&gt;&lt;br&gt;ERRORLOG ファイルの保存場所を確認する方法&lt;br&gt;デフォルトの設定を受け入れて SQL Server をインストールすると、だいたい次のような場所にあるはずです。&lt;br&gt;&lt;br&gt;C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER2014\MSSQL\Log&lt;br&gt;&lt;br&gt;黄色でハイライトされている箇所は、SQL Server のバージョンや、名前付きインスタンスかなどで変わってきます。&lt;br&gt;&lt;br&gt;&lt;br&gt;実際のエラーログファイルの保存場所は次のように確認できます。&lt;br&gt;&lt;br&gt;Windows の検索で 「 SQLServerManager&lt;バージョン&gt;.msc 」 と入力するなどして、SQL Server 構成マネージャー (SQL Server Configuration Manager) を探して起動します。&lt;br&gt;&lt;br&gt;SQL Server 2017 -&gt; SQLServerManager14.msc&lt;br&gt;SQL Server 2016 -&gt; SQLServerManager13.msc&lt;br&gt;SQL Server 2014 -&gt; SQLServerManager12.msc&lt;br&gt;SQL Server 2012 -&gt; SQLServerManager11.msc&lt;br&gt;&lt;br&gt;SQL Server 構成マネージャーの左側で [SQL Server のサービス] を選択し、右側で ERRORLOG ファイルの場所を確認したい SQL Server で右クリックして [プロパティ] を選択します。&lt;br&gt;&lt;br&gt;SQL Server ログ - ERRORLOG ファイルの保存場所 3&lt;br&gt;&lt;br&gt;&lt;br&gt;[起動時のパラメーター] タブを選択し、 -e から始まるパスがログファイルの保存場所です。&lt;br&gt;&lt;br&gt;SQL Server ログ - ERRORLOG ファイルの保存場所 4</description><pubDate>Thu, 07 Feb 2019 21:58:00 GMT</pubDate><category>SQL Server＆T-SQLに関するコラム</category></item>
<item><title>SQL Server - データベースファイルのデフォルトの保存場所を変更する</title><link>https://sql55.com/column/how-to-change-locations-for-database-files.php</link><description>SQL Server - データベースファイルのデフォルトの保存場所を変更する&lt;br&gt; 0      0 　　　　&lt;br&gt;&lt;br&gt; &lt;br&gt;データベースファイルのデフォルトの保存場所&lt;br&gt;「 ログファイルの保存場所を変更する方法 」 では、既存のデータベースのデータベースファイルの保存場所の変更方法をご説明しました。&lt;br&gt;&lt;br&gt;この記事では、データベースファイルのデフォルトの保存場所を変更する方法をご紹介します。&lt;br&gt;&lt;br&gt;&lt;br&gt;データベースファイルのデフォルトの保存場所を変更する方法&lt;br&gt;xp_instance_regwrite を使って、スクリプトでも変更できるのですが、あまり利点がないので SQL Server Management Studio の UI　から行います。&lt;br&gt;&lt;br&gt;&lt;br&gt;1. SQL Server Management Studio のオブジェクトエクスプローラで変更したいデータベースサーバを選択し、右クリックで [プロパティ]をクリックします。&lt;br&gt;&lt;br&gt;データベースファイルのデフォルトの保存場所　1&lt;br&gt;&lt;br&gt;&lt;br&gt;2. 左側で [データベースの設定]を選択すると、データベースの既定の場所の設定箇所が表示されます。&lt;br&gt;&lt;br&gt;データベースファイルのデフォルトの保存場所　2&lt;br&gt;&lt;br&gt;&lt;br&gt;3. データ、ログ、バックアップファイルののデフォルト保存場所を必要に応じて変更し、[OK]をクリックします。&lt;br&gt;&lt;br&gt;データベースファイルのデフォルトの保存場所　3&lt;br&gt;&lt;br&gt;&lt;br&gt;4. 再度 SQL Server Management Studio のオブジェクトエクスプローラで変更したいデータベースサーバを選択し、右クリックで [再起動]します。&lt;br&gt;&lt;br&gt;データベースファイルのデフォルトの保存場所　4&lt;br&gt;&lt;br&gt;これで、次回新しいデータベースの作成する時から、新しい保存場所にデータベースファイルが生成されるようになります。&lt;br&gt;&lt;br&gt;&lt;br&gt;試しに Temp6 というデータベースを作ってみました。&lt;br&gt;&lt;br&gt;データとログファイルのデフォルトの保存場所が先ほど指定した場所になっていて、そのままで問題なく生成できました。&lt;br&gt;&lt;br&gt;データベースファイルのデフォルトの保存場所　5&lt;br&gt;&lt;br&gt;データベースファイルのデフォルトの保存場所　6</description><pubDate>Fri, 21 Dec 2018 01:51:00 GMT</pubDate><category>SQL Server＆T-SQLに関するコラム</category></item>
<item><title>SQL Server: ID 値 (IDENTITY) をリセット (RESEED) する方法</title><link>https://sql55.com/query/how-to-reseed-identity-value-to-max.php</link><description>SQL Server: ID 値 (IDENTITY) をリセット (RESEED) する方法&lt;br&gt; 0      0 　　　　&lt;br&gt;&lt;br&gt; &lt;br&gt;ID 値 (IDENTITY) をリセット(RESEED)する方法&lt;br&gt;テーブルのレコード数が増えてきて、レコードを大量に削除したりした後で、ID 値 (IDENTITY) を現在のレコード数に合わせてリセットしたいような時ありませんか？&lt;br&gt;&lt;br&gt;今回は、ID 値 (IDENTITY) をリセット(RESEED)する方法をご紹介します。&lt;br&gt;&lt;br&gt;&lt;br&gt;DBCC CHECKIDENT で ID 値を RESEED する&lt;br&gt;DBCC CHECKIDENT ステートメントで使うと、ID 値 (IDENTITY)値を確認したり、現在の ID 値を変更したりすることができます。&lt;br&gt;&lt;br&gt;&lt;br&gt;まず、現在の ID 値（SQL Server が持っているカウンターの値）と現在の列値（テーブルの ID 列に入っている最大の値）をチェックするスクリプトは以下の通りです。&lt;br&gt;&lt;br&gt;DBCC CHECKIDENT ([テーブル名], NORESEED);&lt;br&gt;ID 値 (IDENTITY) をリセット(RESEED)する方法 1&lt;br&gt;&lt;br&gt;現在の ID 値と現在の列値が同じ状態が普通の状態だと思います。&lt;br&gt;&lt;br&gt;&lt;br&gt;次に、現在の ID 値（SQL Server が持っているカウンターの値）が現在の列値（テーブルの ID 列に入っている最大の値）より小さい場合、例えば先ほどのスクリプトでチェックした時に次のような状態になっている時です。&lt;br&gt;&lt;br&gt;ID 値 (IDENTITY) をリセット(RESEED)する方法 2&lt;br&gt;&lt;br&gt;そんな時は次のスクリプトで現在の ID 値をリセットできます。&lt;br&gt;&lt;br&gt;DBCC CHECKIDENT ([テーブル名]);&lt;br&gt;ID 値 (IDENTITY) をリセット(RESEED)する方法 3&lt;br&gt;&lt;br&gt;現在の ID 値が 2 から 8 に更新されていますね。&lt;br&gt;&lt;br&gt;&lt;br&gt;MAX の値に現在の ID 値をリセットする&lt;br&gt;最初に書いたようにレコードを削除した後には、次のようなに現在の ID 値（SQL Server が持っているカウンターの値）が現在の列値（テーブルの ID 列に入っている最大の値）より大きくなっていると思います。&lt;br&gt;&lt;br&gt;ID 値 (IDENTITY) をリセット(RESEED)する方法 4&lt;br&gt;&lt;br&gt;この状態で先ほどの DBCC CHECKIDENT ([テーブル名]); を実行しても、現在の ID 値は更新されません。&lt;br&gt;&lt;br&gt;ID 値 (IDENTITY) をリセット(RESEED)する方法 5&lt;br&gt;&lt;br&gt;&lt;br&gt;そんな時は、次のスクリプトで値を指定して、現在の ID 値を RESEED します。&lt;br&gt;&lt;br&gt;DBCC CHECKIDENT ([テーブル名], RESEED, [ID 値]);&lt;br&gt;&lt;br&gt;現在の最大値に ID 値をリセットする簡単な方法は、このスクリプトで一旦 ID 値を 0 にリシードし、先ほどのスクリプトで自動的に最大値に更新させる方法です。&lt;br&gt;&lt;br&gt;DBCC CHECKIDENT ([テーブル名], RESEED, 0); -- 0 にリセット&lt;br&gt;DBCC CHECKIDENT ([テーブル名]); -- 最大値にリセット&lt;br&gt;&lt;br&gt;DBCC CHECKIDENT ([テーブル名], NORESEED); -- チェック&lt;br&gt;ID 値 (IDENTITY) をリセット(RESEED)する方法 6&lt;br&gt;&lt;br&gt;現在の ID 値が 8 -&gt; 0 -&gt; 3 のように更新されていますね。&lt;br&gt;&lt;br&gt;&lt;br&gt;もちろん MAX の値を自分で取得して、一回の DBCC CHECKIDENT ([テーブル名], RESEED, 最大値); で更新してしまってもかまいません。&lt;br&gt;&lt;br&gt;DECLARE @MaxTestID INT = ISNULL((SELECT MAX(TestID) FROM Test), 0);&lt;br&gt;&lt;br&gt;DBCC CHECKIDENT (&#039;dbo.Test&#039;, RESEED, @MaxTestID); -- 最大値にリセット&lt;br&gt;&lt;br&gt;DBCC CHECKIDENT (&#039;dbo.Test&#039;, NORESEED); -- チェック&lt;br&gt;ID 値 (IDENTITY) をリセット(RESEED)する方法 7&lt;br&gt;&lt;br&gt;&lt;br&gt;DBCC CHECKIDENT ([テーブル名], RESEED, [ID 値]) の [ID 値] は自由に設定できますが、次に生成される ID 値が既にテーブルに存在していて、そのカラムにプライマリーキーやユニーク制約がついている場合、次にレコードをした時に重複のエラーになるので気をつけてください。&lt;br&gt;&lt;br&gt;ちなみに、IDENTITY_INSERT を ON にして ID 値を指定してレコードをインサートした時でも、挿入した ID 値が 今までの ID の値よりも大きい場合は、現在の ID 値がその最大値で置き換えられるので、RESEED する必要はありません。</description><pubDate>Fri, 07 Dec 2018 23:13:00 GMT</pubDate><category>便利なT-SQL＆クエリー集</category></item>
<item><title>SQL Server - ログファイルの保存場所を変更する方法</title><link>https://sql55.com/column/how-to-move-log-file.php</link><description>SQL Server - ログファイルの保存場所を変更する方法&lt;br&gt; &lt;br&gt;ログファイルの保存場所を変更したい&lt;br&gt;SQL Server のトランザクションログファイル等のサイズが大きくなってディスク領域を圧迫し、保存場所を後から変更したいような時はないでしょうか。&lt;br&gt;&lt;br&gt;この記事では、既存のデータベースのトランザクションログファイル(ldf ファイル）を他の場所に移す方法をご紹介します。&lt;br&gt;&lt;br&gt; 今回はログファイルの保存場所を変更しますが、全く同じ方法で、データファイル（mdf・ndf ファイル）も移動可能です。&lt;br&gt;&lt;br&gt;トランザクションログファイルの保存場所を変更する方法&lt;br&gt;今回は Test データベースのログファイルの場所を、違うドライブのフォルダーに変更します。&lt;br&gt;&lt;br&gt;&lt;br&gt;1. まずは次のクエリーを実行して、ターゲットとなるデータベースの、ログファイルの論理名と現在の保存場所を確認します。&lt;br&gt;&lt;br&gt;SELECT	name, &lt;br&gt;	physical_name,&lt;br&gt;	type_desc&lt;br&gt;FROM	sys.master_files&lt;br&gt;WHERE	database_id = DB_ID(N&#039;Test&#039;);	&lt;br&gt;ログファイルの保存場所を変更する方法　1&lt;br&gt;&lt;br&gt;Test データベースのログファイルの論理名（logical_name) は Test_log ですね。&lt;br&gt;&lt;br&gt;&lt;br&gt;2. 次に以下のクエリーで Test データベースをオフラインにします。&lt;br&gt;&lt;br&gt;ALTER DATABASE Test SET OFFLINE;&lt;br&gt;ログファイルの保存場所を変更する方法　2&lt;br&gt;&lt;br&gt;* クエリーの実行に時間がかかって終わらない場合は、利用状況モニターなどで、そのデータベースに対してアクティブなプロセスを確認して強制終了させてください。&lt;br&gt;&lt;br&gt;ログファイルの保存場所を変更する方法　10&lt;br&gt;&lt;br&gt;ログファイルの保存場所を変更する方法　11&lt;br&gt;&lt;br&gt;&lt;br&gt;3. ログファイルを新しい保存先に移動します。&lt;br&gt;&lt;br&gt;ログファイルの保存場所を変更する方法　3&lt;br&gt;&lt;br&gt;移動元： C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER2017\MSSQL\DATA\&lt;br&gt;移動先： D:\MSSQL\DATA\&lt;br&gt;&lt;br&gt;4. 次のスクリプトを実行して、Test データベースのログファイルの保存場所を更新します。&lt;br&gt;&lt;br&gt;NAME には No.1 で調べたログファイルの論理名を、FILENAME にはログファイルの移動先のパスとログファイル名を指定してください。&lt;br&gt;&lt;br&gt;ALTER DATABASE Test &lt;br&gt;MODIFY FILE (NAME = Test_log, FILENAME = &#039;D:\MSSQL\DATA\Test_log.ldf&#039;); &lt;br&gt;ログファイルの保存場所を変更する方法　4&lt;br&gt;&lt;br&gt;&lt;br&gt;4. 次に以下のクエリーで Test データベースをオンラインに戻します。&lt;br&gt;&lt;br&gt;ALTER DATABASE Test SET ONLINE;&lt;br&gt;ログファイルの保存場所を変更する方法　6&lt;br&gt;&lt;br&gt;&lt;br&gt;このスクリプトを実行した時に次のようなエラーが出ることがあるかもしれません。&lt;br&gt;&lt;br&gt;Msg 5120, Level 16, State 101, Line 1&lt;br&gt;物理ファイル &quot;D:\MSSQL\DATA\Test_log.ldf&quot; を開けません。&lt;br&gt;オペレーティング システム エラー 5: &quot;5(Access is denied.)&quot;。&lt;br&gt;ファイル アクティブ化エラー。物理ファイル名 &quot;D:\MSSQL\DATA\Test_log.ldf&quot; が正しくない可能性があります。&lt;br&gt;Msg 5181, Level 16, State 5, Line 1&lt;br&gt;データベース &quot;Test&quot; を再起動できませんでした。以前の状態に戻しています。&lt;br&gt;Msg 5069, Level 16, State 1, Line 1&lt;br&gt;ALTER DATABASE ステートメントが失敗しました。&lt;br&gt;&lt;br&gt;ログファイルの保存場所を変更する方法　5&lt;br&gt;&lt;br&gt;これは、SQL Server のサービスアカウントがログファイルにアクセスする権限がない為です。&lt;br&gt;&lt;br&gt;SQL Server のサービスアカウントを SQL Server 構成マネージャー等で確認して、アクセス権限を追加してください。&lt;br&gt;&lt;br&gt;ログファイルの保存場所を変更する方法　7&lt;br&gt;&lt;br&gt;ログファイルの保存場所を変更する方法　8&lt;br&gt;&lt;br&gt;&lt;br&gt;これで、ログファイルの保存場所を変更完了です。&lt;br&gt;&lt;br&gt;試しに No.1 のクエリーをもう一度実行してみると、保存場所が変更されていますね！&lt;br&gt;&lt;br&gt;ログファイルの保存場所を変更する方法　9</description><pubDate>Fri, 16 Nov 2018 00:58:00 GMT</pubDate><category>SQL Server＆T-SQLに関するコラム</category></item>
<item><title>SQL Server Management Studio - 改行入りのデータを Excel にエクスポートする</title><link>https://sql55.com/sql-server/ssms-export-data-to-excel.php</link><description>SQL Server Management Studio - 改行入りのデータを Excel にエクスポートする&lt;br&gt; 0      0 　　　　&lt;br&gt;&lt;br&gt; &lt;br&gt;SQL Server Management Studio で Excel にエクスポートする&lt;br&gt;テーブルに入ってるデータや、クエリーを書いて取得したデータなどを Excel にエクスポートしたい時ありますよね。&lt;br&gt;&lt;br&gt;簡単な方法は、クエリエディターの結果グリッドで、レコードを選択して、右クリックでコピーやヘッダー付きでコピーして Excel ファイルに貼り付けることだと思います。&lt;br&gt;&lt;br&gt;改行入りのデータを Excel にエクスポートする 1&lt;br&gt;&lt;br&gt;改行入りのデータを Excel にエクスポートする 2&lt;br&gt;&lt;br&gt;&lt;br&gt;ただ、この方法だと、値に改行が入っていた時に、SQL Server Management Studio (SSMS) のバージョンや設定によっては、それ以降のカラムと値がずれてしまうことがあります。&lt;br&gt;&lt;br&gt;例えば、StudentID = 2 の Memo カラムに次のような値を保存します。&lt;br&gt;&lt;br&gt;１行目&lt;br&gt;２行目&lt;br&gt;３行目&lt;br&gt;そして、SSMS 2014 の結果グリッドからコピーしてエクセルに貼り付けるとこんな感じになります。&lt;br&gt;&lt;br&gt;改行入りのデータを Excel にエクスポートする 3&lt;br&gt;&lt;br&gt;改行入りのデータを Excel にエクスポートする 4&lt;br&gt;&lt;br&gt;&lt;br&gt;SSMS 2016 以降では、結果グリッドからコピーまたは保存時に CR/LF を保持するかどうかが選択できるようになり、デフォルトでは保持しない設定になっている為、改行がスペースに置き換えられ、一行になって貼り付けされます。&lt;br&gt;&lt;br&gt;改行入りのデータを Excel にエクスポートする 5&lt;br&gt;&lt;br&gt;&lt;br&gt;もし、SSMS 2016 より前のように、コピーまたは保存時に CR/LF を保持したい場合には、[ツール] &gt; [オプション] &gt; [クエリ結果] &gt; [SQL Server] &gt; [結果をグリッドに表示] で、[コピーまたは保存時に CR/LF を保持] のオプションをオンにしてください。&lt;br&gt;&lt;br&gt;改行入りのデータを Excel にエクスポートする 6&lt;br&gt;&lt;br&gt;改行入りのデータを Excel にエクスポートする 7&lt;br&gt;&lt;br&gt;&lt;br&gt;改行入りのデータを Excel にエクスポートする&lt;br&gt;改行が保持された状態で、データを Excel にエクスポートしたい時は、SQL Server Management Studio の データのエクスポート 機能を使ってエクスポートすることができます。&lt;br&gt;&lt;br&gt;オブジェクトエクスプローラから、データベースで右クリックし、[タスク] &gt; [データのエクスポート] を選択します。&lt;br&gt;&lt;br&gt;改行入りのデータを Excel にエクスポートする 8&lt;br&gt;&lt;br&gt;&lt;br&gt;ウィザードが始まりますので [次へ] をクリックします。&lt;br&gt;&lt;br&gt;改行入りのデータを Excel にエクスポートする 9&lt;br&gt;&lt;br&gt;&lt;br&gt;[データ ソースの選択] 画面で、今回は SQL Server Native Client 11.0 を選択します。&lt;br&gt;&lt;br&gt;改行入りのデータを Excel にエクスポートする 10&lt;br&gt;&lt;br&gt;&lt;br&gt;サーバー名、ログイン情報、データベースを入力し、[次へ] をクリックします。&lt;br&gt;&lt;br&gt;改行入りのデータを Excel にエクスポートする 11&lt;br&gt;&lt;br&gt;&lt;br&gt;[変換先の選択] 画面で、Microsoft Excel を選択します。&lt;br&gt;&lt;br&gt;改行入りのデータを Excel にエクスポートする 12&lt;br&gt;&lt;br&gt;&lt;br&gt;エクスポート先のパスとファイル名、Excel のバージョンを指定し、[次へ] をクリックします。&lt;br&gt;&lt;br&gt;改行入りのデータを Excel にエクスポートする 13&lt;br&gt;&lt;br&gt;&lt;br&gt;先ほどのクエリーをそのまま出力したいので、[転送するデータを指定するためのクエリを記述する]を選択し、[次へ] をクリックします。&lt;br&gt;&lt;br&gt;改行入りのデータを Excel にエクスポートする 14&lt;br&gt;&lt;br&gt;&lt;br&gt;[基になるクエリの指定] 画面が出てくるので、先ほどのクエリーをペーストし、[次へ] をクリックします。&lt;br&gt;&lt;br&gt;改行入りのデータを Excel にエクスポートする 15&lt;br&gt;&lt;br&gt;&lt;br&gt;テーブルの選択やマッピングの画面が出てきますが、今回は何も変更せずに[次へ] をどんどんクリックし、[完了]までクリックします。&lt;br&gt;&lt;br&gt;改行入りのデータを Excel にエクスポートする 16&lt;br&gt;&lt;br&gt;改行入りのデータを Excel にエクスポートする 17&lt;br&gt;&lt;br&gt;改行入りのデータを Excel にエクスポートする 18&lt;br&gt;&lt;br&gt;改行入りのデータを Excel にエクスポートする 19&lt;br&gt;&lt;br&gt;改行入りのデータを Excel にエクスポートする 20&lt;br&gt;&lt;br&gt;&lt;br&gt;エクスポートされた Student.xlsx ファイルを確認してみると、改行が保持されていますね！&lt;br&gt;&lt;br&gt;改行入りのデータを Excel にエクスポートする 21</description><pubDate>Wed, 29 Aug 2018 01:27:00 GMT</pubDate><category>Microsoft SQL Server 入門</category></item>
<item><title>ログインできない状態で SQL Server の認証モードを変更する方法</title><link>https://sql55.com/column/how-to-change-sql-server-auth-mode-without-ssms.php</link><description>ログインできない状態で SQL Server の認証モードを変更する方法&lt;br&gt; 0      0 　　　　&lt;br&gt;&lt;br&gt; &lt;br&gt;ログインできない状態で SQL Server の認証モードを変更したい&lt;br&gt;SQL Server の認証モードには、[Windows 認証モード] と [SQL Server 認証モードと Windows 認証モード]があります。&lt;br&gt;&lt;br&gt;認証モードは SQL Server Management Studio から SQL Server に接続し、オブジェクトエクスプローラーでサーバーを選択して、右クリックでプロパティをクリックし、セキュリティのページで変更可能です。&lt;br&gt;&lt;br&gt;SQL Server - 完全にロックアウトされてログインできない時の対処方法　2&lt;br&gt;&lt;br&gt;ここでは SQL Server Management Studio から SQL Server にログインできないような状態で、SQL Server の認証モードを変更する方法をご紹介します。&lt;br&gt;&lt;br&gt;&lt;br&gt;レジストリで SQL Server の認証モードを変更する&lt;br&gt;SQL Server 用のレジストリの値を変更することによって、認証モードを変更することができます。&lt;br&gt;&lt;br&gt; レジストリの変更はシステムを壊す可能性がありますので、くれぐれも慎重に作業してください。&lt;br&gt;Windows のスタートメニューの検索で regedit と入力して、レジストリエディタを開きます。&lt;br&gt;&lt;br&gt;以下のロケーションにある LoginMode を探します。&lt;br&gt;&lt;br&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL14.MSSQLSERVER2017\MSSQLServer&lt;br&gt;&lt;br&gt;SQL Server - 完全にロックアウトされてログインできない時の対処方法　2&lt;br&gt;&lt;br&gt;太字の部分はインストールされている SQL Server やインスタンス名によって違います。&lt;br&gt;&lt;br&gt;もしどれかわからない場合は、SQL Server 構成マネージャーで確認できます。&lt;br&gt;&lt;br&gt;Windows のスタートメニューの検索で SQLServerManager&lt;バージョン&gt;.msc と入力して、SQL Server 構成マネージャーを開きます。&lt;br&gt;&lt;br&gt;各 SQL Server に対応するバージョンは以下の通りです。&lt;br&gt;&lt;br&gt;SQL Server 2012 - SQLServerManager11.msc&lt;br&gt;SQL Server 2014 - SQLServerManager12.msc&lt;br&gt;SQL Server 2016 - SQLServerManager13.msc&lt;br&gt;SQL Server 2017 - SQLServerManager14.msc&lt;br&gt;認証モードを変更したい SQL Server を右クリックして [プロパティ] を表示し、[詳細設定] タブの [レジストリルート] で確認してください。&lt;br&gt;&lt;br&gt;SQL Server - 完全にロックアウトされてログインできない時の対処方法　3&lt;br&gt;&lt;br&gt;&lt;br&gt;レジストリエディタに戻って、LoginMode の値は 1 が [Windows 認証モード]、2 が [SQL Server 認証モードと Windows 認証モード] です。&lt;br&gt;&lt;br&gt;LoginMode を右クリックして [修正] をクリックします。&lt;br&gt;&lt;br&gt;SQL Server - 完全にロックアウトされてログインできない時の対処方法　4&lt;br&gt;&lt;br&gt;今回は [Windows 認証モード] から [SQL Server 認証モードと Windows 認証モード] に変更したいので、値を 1 から 2 に変更して [OK] をクリックします。&lt;br&gt;&lt;br&gt;SQL Server - 完全にロックアウトされてログインできない時の対処方法　5&lt;br&gt;&lt;br&gt;&lt;br&gt;SQL Server 構成マネージャーから SQL Server を再起動すれば、SQL Server 認証でもログインできるようになります。&lt;br&gt;&lt;br&gt;SQL Server - 完全にロックアウトされてログインできない時の対処方法　6</description><pubDate>Wed, 08 Aug 2018 00:36:00 GMT</pubDate><category>SQL Server＆T-SQLに関するコラム</category></item>
<item><title>SQL Server - 完全にロックアウトされてログインできない時の対処方法</title><link>https://sql55.com/column/sql-server-completely-locked-out.php</link><description>SQL Server - 完全にロックアウトされてログインできない時の対処方法&lt;br&gt; 0      0 　　　　&lt;br&gt;&lt;br&gt; &lt;br&gt;完全にロックされてログインできない！&lt;br&gt;今回はめったにないことかもしれませんが、 sa アカウントや sysadmin のロールのメンバーが全員なんらかの理由でログインできなくなってしまった時に SQL Server に接続する方法をご紹介します。&lt;br&gt;&lt;br&gt; sysadmin ロールのメンバーでログインできる時は、簡単にロックを解除できますので、こちらのページをご覧ください。&lt;br&gt; SQL Server - sa アカウントのロック解除方法&lt;br&gt;&lt;br&gt;SQL Server - 完全にロックアウトされてログインできない時の対処方法&lt;br&gt;完全にロックアウトされた時は、SQL Server に sysadmin メンバの新しいログインを作って、そのユーザーでログインできるようにします。&lt;br&gt;&lt;br&gt;今回は名前付きインスタンス MSSQLSERVER2017 がロックアウトされたとします。&lt;br&gt;&lt;br&gt;手順は次の通りです。&lt;br&gt;&lt;br&gt;1. SQL Server 構成マネージャーから、SQL Server をシングルユーザーモードで起動する&lt;br&gt;SQL Server をシングルユーザーモードで起動します。&lt;br&gt;&lt;br&gt; シングルユーザーモードにすることによって、コンピューターのローカル Administrators グループのメンバーが sysadmin のメンバーとして SQL Server のインスタンスに接続できるようになります。&lt;br&gt;まず、Windows のスタートメニューの検索で SQLServerManager&lt;バージョン&gt;.msc と入力して、SQL Server 構成マネージャーを開きます。&lt;br&gt;&lt;br&gt;各 SQL Server に対応するバージョンは以下の通りです。&lt;br&gt;&lt;br&gt;SQL Server 2012 - SQLServerManager11.msc&lt;br&gt;SQL Server 2014 - SQLServerManager12.msc&lt;br&gt;SQL Server 2016 - SQLServerManager13.msc&lt;br&gt;SQL Server 2017 - SQLServerManager14.msc&lt;br&gt;&lt;br&gt;先にログインされてしまうと困るので SQL Server エージェント が起動している場合はストップします。&lt;br&gt;&lt;br&gt;SQL Server - 完全にロックアウトされてログインできない時の対処方法　1&lt;br&gt;&lt;br&gt;&lt;br&gt;該当の SQL Server を右クリックし、[プロパティ] を開きます。&lt;br&gt;&lt;br&gt;SQL Server - 完全にロックアウトされてログインできない時の対処方法　2&lt;br&gt;&lt;br&gt;[起動時のパラメーター] タブをクリックし、[起動時のパラメーターの指定] の箇所に -m と入力し [追加]をクリックし、[OK] をクリックします。&lt;br&gt;&lt;br&gt;SQL Server - 完全にロックアウトされてログインできない時の対処方法　3&lt;br&gt;&lt;br&gt;SQL Server を右クリックし再起動します。 これで、シングルユーザーモードで起動されました。&lt;br&gt;&lt;br&gt;SQL Server - 完全にロックアウトされてログインできない時の対処方法　4&lt;br&gt;&lt;br&gt;&lt;br&gt;2. sqlcmd ユーティリティで sysadmin メンバの新しいログインを作成する&lt;br&gt;Windows のスタートメニューの検索で cmd と入力して、コマンドプロンプトを開きます。&lt;br&gt;&lt;br&gt;以下のコマンドを入力して sqlcmd ユーティリティを起動します。&lt;br&gt;&lt;br&gt;sqlcmd -S .\MSSQLSERVER2017&lt;br&gt;SQL Server - 完全にロックアウトされてログインできない時の対処方法　5&lt;br&gt;&lt;br&gt;-S オプションはサーバーとインスタスのオプションで、今回は名前付きインスタンスに接続したいので -S .\MSSQLSERVER2017 と指定しました。&lt;br&gt;&lt;br&gt;デフォルトインスタンスの場合は sqlcmd だけでオプションをつけなくて大丈夫です。&lt;br&gt;&lt;br&gt;&lt;br&gt;以下のコマンドを実行して、TempLogin1 という名前のログインユーザーを作り、TempLogin1 を sysadmin のメンバーにします。&lt;br&gt;&lt;br&gt;CREATE LOGIN TempLogin1 WITH PASSWORD=&#039;TPl@g1n$&#039;&lt;br&gt;GO&lt;br&gt;EXEC sp_addsrvrolemember TempLogin1, sysadmin&lt;br&gt;GO&lt;br&gt;SQL Server - 完全にロックアウトされてログインできない時の対処方法　6&lt;br&gt;&lt;br&gt;Ctrl + C で終了します。&lt;br&gt;&lt;br&gt;&lt;br&gt;3. SQL Server 構成マネージャーから、SQL Server をマルチユーザモードに戻してリスタートする&lt;br&gt;SQL Server 構成マネージャーに戻り、先ほど設定した -m　の [起動時のパラメーター] を削除します。&lt;br&gt;&lt;br&gt;SQL Server - 完全にロックアウトされてログインできない時の対処方法　7&lt;br&gt;&lt;br&gt;SQL Server を右クリックし再起動します。&lt;br&gt;&lt;br&gt;SQL Server - 完全にロックアウトされてログインできない時の対処方法　8&lt;br&gt;&lt;br&gt;&lt;br&gt;3. SQL Server Management Studio から作ったユーザーでログインする&lt;br&gt; SQL Server の認証モードが [Windows 認証モード] のみになっている場合はユーザー名とパスワードでログインできません。 こちらの方法で [SQL Server 認証モードと Windows 認証モード] に変更してください。&lt;br&gt; ログインできない状態で SQL Server の認証モードを変更する方法&lt;br&gt;SQL Server Management Studio から、先ほど作ったログインユーザーでログインしてみます。&lt;br&gt;&lt;br&gt;SQL Server - 完全にロックアウトされてログインできない時の対処方法　9&lt;br&gt;&lt;br&gt;無事ログインできましたね！&lt;br&gt;&lt;br&gt;SQL Server - 完全にロックアウトされてログインできない時の対処方法　10&lt;br&gt;&lt;br&gt; ログインアカウントのロックの解除方法が必要な方はこちらをご覧ください。&lt;br&gt; SQL Server - sa アカウントのロック解除方法</description><pubDate>Wed, 08 Aug 2018 00:33:00 GMT</pubDate><category>SQL Server＆T-SQLに関するコラム</category></item>
<item><title>SQL Server - sa アカウントのロック解除方法</title><link>https://sql55.com/column/sql-server-sa-account-locked-out.php</link><description>SQL Server - sa アカウントのロック解除方法&lt;br&gt; 0      0 　　　　&lt;br&gt;&lt;br&gt; &lt;br&gt;sa アカウントがロックされた！&lt;br&gt;今回は sa アカウントがロックされて、SQL Server に sa アカウントで接続できない！というような状況になった時の解除方法と、アカウントがロックされないようにする方法についてです。&lt;br&gt;&lt;br&gt;ここでは他の sysadmin ロールのメンバーで SQL Server にログインできる状態を想定しています。&lt;br&gt;&lt;br&gt; もし、sysadmin ロールのメンバーも含めて、完全にロックアウトされてしまった場合はこちらのページをご覧ください。&lt;br&gt; 完全にロックアウトされてログインできない時の対処方法&lt;br&gt;&lt;br&gt;パスワードを変更せずに sa アカウントのロックを解除する&lt;br&gt;sa のパスワードを変更せずに sa アカウントのロックを解除してみましょう。&lt;br&gt;&lt;br&gt;まず、SQL Server Management Studio で SQL Server に sysadmin のメンバーであるユーザーでログインします。&lt;br&gt;&lt;br&gt;クエリエディターを開き、以下のスクリプトを実行すると、パスワードはそのままで sa アカウントのログインのロックが解除されます。&lt;br&gt;&lt;br&gt;ALTER LOGIN sa WITH CHECK_POLICY = OFF; &lt;br&gt;ALTER LOGIN sa WITH CHECK_POLICY = ON; &lt;br&gt;このスクリプトでは、 sa のパスワードポリシーの適用を一度 OFF にして ON に戻すことによってロックを解除しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;アカウントがロックされる理由&lt;br&gt;sa アカウントに関わらずですが、アカウントがロックされる理由は、そのログインの [パスワードポリシーを適用する] がオンになっているからです。&lt;br&gt;&lt;br&gt;オブジェクトエクスプローラの [セキュリティ] &gt; [ログイン] で sa アカウントを右クリックし、[プロパティ]をクリックします。&lt;br&gt;&lt;br&gt;sa アカウントのロック解除方法　1&lt;br&gt;&lt;br&gt;[全般] のページの[パスワードポリシーを適用する] でオン・オフを確認することができます。&lt;br&gt;&lt;br&gt;sa アカウントのロック解除方法　2&lt;br&gt;&lt;br&gt;[パスワードポリシーを適用する] がオンの時は、SQL Server を実行しているコンピューターの Windows のパスワードポリシーが適用され、何回もログインに失敗するとアカウントがロックされてしまいます。&lt;br&gt;&lt;br&gt;このチェックを一度オフにして OK をクリックし、オンに戻して OK をクリックすることによって、先ほどのスクリプトと同様のことを UI から実行することができます。&lt;br&gt;&lt;br&gt;そのログインユーザーにパスワードポリシーを適用する必要がない場合は、オフのままにしておけば、ロックされなくなります。&lt;br&gt;&lt;br&gt;&lt;br&gt;ロックされているかどうかはログインユーザーの [プロパティ]の [ステータス] ページで確認できます。&lt;br&gt;&lt;br&gt;sa アカウントのロック解除方法　3&lt;br&gt;&lt;br&gt;ここからもアカウントのロックを解除できますが、[ログインをロックアウトする] のチェックボックスをオフにして OK をクリックすると、パスワードをリセットするようにというエラーが出ます。&lt;br&gt;&lt;br&gt;sa アカウントのロック解除方法　4&lt;br&gt;&lt;br&gt;[全般]ページにいって、パスワードを入力しなおしてから OK をクリックしてください。&lt;br&gt;&lt;br&gt;&lt;br&gt;今回ご説明した解除方法などは、sa アカウントだけでなく、他のログインユーザーでも同様です。&lt;br&gt;&lt;br&gt;スクリプトを実行する際は、次のように sa の部分を、ロックを解除したいログインユーザー名に置き換えて実行してくださいね！&lt;br&gt;&lt;br&gt;ALTER LOGIN [ログインユーザー名] WITH...</description><pubDate>Wed, 08 Aug 2018 00:32:00 GMT</pubDate><category>SQL Server＆T-SQLに関するコラム</category></item>
<item><title>知っておくと便利な関数 - NULLIF</title><link>https://sql55.com/t-sql/t-sql-nullif.php</link><description>知っておくと便利な関数 - NULLIF&lt;br&gt; 0      0 　　　　&lt;br&gt;&lt;br&gt; &lt;br&gt;知っておくと便利な関数 - NULLIF&lt;br&gt;今回は知っておくと便利なビルトイン関数のひとつ、 NULLIF についてです。&lt;br&gt;&lt;br&gt;&lt;br&gt;NULLIF ファンクション&lt;br&gt;NULLIF ファンクションは、二つの引数を受け取り、一つ目と二つ目の引数が同じ場合は NULL を返し、違う場合は一つ目の引数を返す関数です。&lt;br&gt;&lt;br&gt;構文は次の通りです。&lt;br&gt;&lt;br&gt;NULLIF ( [値 1] , [値 2] )&lt;br&gt;戻り値のデータ型は [値 1] のデータ型になります。&lt;br&gt;&lt;br&gt;&lt;br&gt;行われる処理は以下の CASE 文と同じです。&lt;br&gt;&lt;br&gt;CASE &lt;br&gt;   WHEN [値 1] = [値 2] &lt;br&gt;      THEN NULL&lt;br&gt;      ELSE [値 1]&lt;br&gt;END&lt;br&gt;&lt;br&gt;NULLIF 関数を使って、変数に &#039;N/A&#039; と入っている時は NULL に変換してみましょう。&lt;br&gt;&lt;br&gt;DECLARE @InputValue1 VARCHAR(50) = &#039;ABC&#039;,&lt;br&gt;	@InputValue2 VARCHAR(50) = &#039;N/A&#039;;&lt;br&gt;&lt;br&gt;SELECT	NULLIF(@InputValue1, &#039;N/A&#039;) AS Value1,&lt;br&gt;	NULLIF(@InputValue2, &#039;N/A&#039;) AS Value2;&lt;br&gt;知っておくと便利な関数 - NULLIF 1&lt;br&gt;&lt;br&gt;@InputValue2 のほうは &#039;N/A&#039; と等しいので、NULL が返ってきていますね。&lt;br&gt;&lt;br&gt;&lt;br&gt;次のような感じで、入力の引数に空文字列が入っている場合は NULL に変換してテーブルに保存したいような時にも便利です。&lt;br&gt;&lt;br&gt;DECLARE @InputValue1 VARCHAR(50) = &#039;&#039;;&lt;br&gt;&lt;br&gt;SET @InputValue1 = NULLIF(@InputValue1, &#039;&#039;);&lt;br&gt;&lt;br&gt;[値 1] と [値 2] のデータ型が違う場合、暗黙的なデータ型の変換が行われて比較されるので、このように変換できない場合はエラーになってしまうのでご注意くださいね！&lt;br&gt;&lt;br&gt;知っておくと便利な関数 - NULLIF 2</description><pubDate>Wed, 01 Aug 2018 00:03:00 GMT</pubDate><category>T-SQL 入門</category></item>
<item><title>SQL Server: 変数やスカラー値関数の戻り値など、値のデータ型を確認する方法</title><link>https://sql55.com/query/check-data-type-of-variable.php</link><description>SQL Server: 変数やスカラー値関数の戻り値など、値のデータ型を確認する方法&lt;br&gt; 0      0 　　　　&lt;br&gt;&lt;br&gt; &lt;br&gt;変数やスカラー値関数の戻り値などのデータ型を確認する方法&lt;br&gt;あんまりないかもしれませんが、ビルトイン関数のスカラー関数を使った後、暗黙の型変換が行われたりして、変数や戻り値のデータ型を確認したいような時はないでしょうか？&lt;br&gt;&lt;br&gt;今回はそんな時に便利な関数をご紹介します！&lt;br&gt;&lt;br&gt;&lt;br&gt;SQL_VARIANT_PROPERTY 関数&lt;br&gt;SQL_VARIANT_PROPERTY 関数は、第一引数の値について、第二引数で指定したプロパティを返します。&lt;br&gt;&lt;br&gt;構文は次の通りです。&lt;br&gt;&lt;br&gt;SQL_VARIANT_PROPERTY ( [値], [プロパティ] )  &lt;br&gt;[プロパティ] には次のようなものが指定可能です。&lt;br&gt;&lt;br&gt;BaseType&lt;br&gt;Precision&lt;br&gt;Scale&lt;br&gt;TotalBytes&lt;br&gt;Collation&lt;br&gt;MaxLength&lt;br&gt;例えば、NVARCHAR(50) や DECIMAL(19,5) で定義された値には各プロパティ次のような値が返ってきます。&lt;br&gt;&lt;br&gt;DECLARE @Memo NVARCHAR(50) = &#039;Test&#039;;&lt;br&gt;&lt;br&gt;SELECT	SQL_VARIANT_PROPERTY(@Memo, &#039;BaseType&#039;) AS [BaseType],&lt;br&gt;	SQL_VARIANT_PROPERTY(@Memo, &#039;Precision&#039;) AS [Precision],&lt;br&gt;	SQL_VARIANT_PROPERTY(@Memo, &#039;Scale&#039;) AS [Scale],&lt;br&gt;	SQL_VARIANT_PROPERTY(@Memo, &#039;TotalBytes&#039;) AS [TotalBytes],&lt;br&gt;	SQL_VARIANT_PROPERTY(@Memo, &#039;Collation&#039;) AS [Collation],&lt;br&gt;	SQL_VARIANT_PROPERTY(@Memo, &#039;MaxLength&#039;) AS [MaxLength];&lt;br&gt;------------&lt;br&gt;DECLARE @Amount DECIMAL(19,5) = 15.66;&lt;br&gt;&lt;br&gt;SELECT	SQL_VARIANT_PROPERTY(@Amount, &#039;BaseType&#039;) AS [BaseType],&lt;br&gt;	SQL_VARIANT_PROPERTY(@Amount, &#039;Precision&#039;) AS [Precision],&lt;br&gt;	SQL_VARIANT_PROPERTY(@Amount, &#039;Scale&#039;) AS [Scale],&lt;br&gt;	SQL_VARIANT_PROPERTY(@Amount, &#039;TotalBytes&#039;) AS [TotalBytes],&lt;br&gt;	SQL_VARIANT_PROPERTY(@Amount, &#039;Collation&#039;) AS [Collation],&lt;br&gt;	SQL_VARIANT_PROPERTY(@Amount, &#039;MaxLength&#039;) AS [MaxLength];&lt;br&gt;変数やスカラー値関数の戻り値などのデータ型を確認する方法 1&lt;br&gt;&lt;br&gt;変数やスカラー値関数の戻り値などのデータ型を確認する方法 2&lt;br&gt;&lt;br&gt;変数だけ定義して、値を代入しないで SQL_VARIANT_PROPERTY に渡すと、第一引数が NULL になるので、全てのプロパティが NULL で返ってくるので注意してください。&lt;br&gt;&lt;br&gt;&lt;br&gt;上記のケースでは SQL_VARIANT_PROPERTY を使う真上でデータ型を指定して変数を宣言しているので、意味があんまりありませんね。&lt;br&gt;&lt;br&gt;次は暗黙的に変換された値のデータ型を調べてみましょう。&lt;br&gt;&lt;br&gt;例えば、COALESCE 関数は引数を順番に前からチェックしていって、NULL ではない最初の値を返しますが、戻り値のデータ型は引数の中で優先順位が最も高いデータ型になります。&lt;br&gt;&lt;br&gt;COALESCE(NULL, 1, &#039;2&#039;, 5.5) の戻り値のデータ型を確認してみましょう。 ここでは BaseType のみ確認します。&lt;br&gt;&lt;br&gt;SELECT	COALESCE(NULL, 1, &#039;2&#039;, 5.5) AS Result,&lt;br&gt;	SQL_VARIANT_PROPERTY(COALESCE(NULL, 1, &#039;2&#039;, 5.5), &#039;BaseType&#039;) AS BaseType;&lt;br&gt;変数やスカラー値関数の戻り値などのデータ型を確認する方法 3&lt;br&gt;&lt;br&gt;最初の NULL でない値は 1 ですが、1.0 に変換されていて、BaseType は numeric になっていますね。&lt;br&gt;&lt;br&gt;&lt;br&gt;また、次のように INT 型と INT 型の割り算が INT 型になってしまうことも確認できます。&lt;br&gt;&lt;br&gt;DECLARE @Value1 INT = 15,&lt;br&gt;	@Value2 INT = 2;&lt;br&gt;&lt;br&gt;SELECT	@Value1 / @Value2 AS Result,&lt;br&gt;	SQL_VARIANT_PROPERTY(@Value1 / @Value2, &#039;BaseType&#039;) AS BaseType;&lt;br&gt;変数やスカラー値関数の戻り値などのデータ型を確認する方法 4&lt;br&gt;&lt;br&gt;値のデータ型を確認したくなった時には使ってみてくださいね！</description><pubDate>Thu, 19 Jul 2018 01:13:00 GMT</pubDate><category>便利なT-SQL＆クエリー集</category></item>
<item><title>T-SQL で累積を取得する 3 - SUM() OVER &amp; ROWS UNBOUNDED PRECEDING</title><link>https://sql55.com/query/cumulative-amount-3.php</link><description>T-SQL で累積を取得する 3 - SUM() OVER &amp; ROWS UNBOUNDED PRECEDING&lt;br&gt; 0      0 　　　　&lt;br&gt;&lt;br&gt; &lt;br&gt;あるカラムの値で区切って累積を取得するには？&lt;br&gt;前回の 「 SQL で累積を取得する 2 」 では、SQL でカラムの値で区切って累積を計算する方法をご紹介しました。&lt;br&gt;&lt;br&gt;今回は、SQL Server 2012 以降で使えるウインドウフレームを使って累積を計算してみましょう。&lt;br&gt;&lt;br&gt;&lt;br&gt;データは前回と全く同じものを使います。&lt;br&gt;&lt;br&gt;以下のクエリーを実行し、テスト用のテーブルを作って、データをインサートします。&lt;br&gt;&lt;br&gt;CREATE TABLE Sales2 (&lt;br&gt;   SalesID INT IDENTITY(1,1) NOT NULL PRIMARY KEY,&lt;br&gt;   SalesDate DATE NULL,&lt;br&gt;   SalesPerson VARCHAR(50) NULL,&lt;br&gt;   SalesAmount MONEY NULL&lt;br&gt;);&lt;br&gt;&lt;br&gt;INSERT INTO Sales2 (&lt;br&gt;   SalesDate,&lt;br&gt;   SalesPerson,&lt;br&gt;   SalesAmount&lt;br&gt;)&lt;br&gt;VALUES &lt;br&gt;   (&#039;1/1/2011&#039;, &#039;Yamada&#039;, 100),&lt;br&gt;   (&#039;1/2/2011&#039;, &#039;Yamada&#039;, 150),&lt;br&gt;   (&#039;1/2/2011&#039;, &#039;Suzuki&#039;, 120),&lt;br&gt;   (&#039;1/3/2011&#039;, &#039;Suzuki&#039;, 200),&lt;br&gt;   (&#039;1/5/2011&#039;, &#039;Yamada&#039;, 80),&lt;br&gt;   (&#039;1/4/2011&#039;, &#039;Suzuki&#039;, 90),&lt;br&gt;   (&#039;1/4/2011&#039;, &#039;Tanaka&#039;, 110),&lt;br&gt;   (&#039;1/5/2011&#039;, &#039;Yamada&#039;, 50),&lt;br&gt;   (&#039;1/6/2011&#039;, &#039;Suzuki&#039;, 90),&lt;br&gt;   (&#039;1/6/2011&#039;, &#039;Tanaka&#039;, 40);&lt;br&gt;T-SQL で累積を取得する 3-1&lt;br&gt;&lt;br&gt;&lt;br&gt;SUM() OVER で ROWS UNBOUNDED PRECEDING を使って累積を計算する&lt;br&gt;SQL Server 2012 以降では、SUM() OVER で、 PARTITION BY、ORDER BY、 ROWS UNBOUNDED PRECEDING を指定することによって、簡単に累積を取得することができます。&lt;br&gt;&lt;br&gt;SalesPerson でグループして、SalesDate 順に累積を計算するクエリーは次の通りです。&lt;br&gt;&lt;br&gt;SELECT	SalesPerson,&lt;br&gt;	SalesDate,&lt;br&gt;	SalesAmount,&lt;br&gt;	SUM(SalesAmount) OVER (PARTITION BY SalesPerson&lt;br&gt;			       ORDER BY	    SalesDate,&lt;br&gt;					    SalesID&lt;br&gt;			       ROWS UNBOUNDED PRECEDING) AS CumulativeAmount&lt;br&gt;FROM	Sales2&lt;br&gt;ORDER BY SalesPerson, SalesDate, SalesID;&lt;br&gt;T-SQL で累積を取得する 3-2&lt;br&gt;&lt;br&gt;SUM(SalesAmount) OVER に続けて、SalesPerson ごとにグルーピングしたいので、PARTITION BY SalesPerson を指定し、SalesDate, SalesID 順に計算したいので ORDER BY SalesDate, SalesID を指定しています。&lt;br&gt;&lt;br&gt;ここまでで、ROWS UNBOUNDED PRECEDING はなくても同様の結果が得られるのですが、指定しなかった場合、RANGE UNBOUNDED PRECEDING AND CURRENT ROW がデフォルトとして使われ、RANGE のほうがパフォーマンスが良くないので、RANGE である必要がない限り ROWS を指定したほうが良いです。&lt;br&gt;&lt;br&gt;ROWS UNBOUNDED PRECEDING は ROWS UNBOUNDED PRECEDING AND CURRENT ROW の略で、UNBOUNDED PRECEDING は 「 パティションの最初から 」 という意味で、ウィンドウの開始位置がパティションの開始位置から、現在の行までという意味になります。&lt;br&gt;&lt;br&gt;&lt;br&gt;いとも簡単に、前回の 「 SQL で累積を取得する 2 」 と全く同様の結果が得られていますね。&lt;br&gt;&lt;br&gt;パフォーマンス的にもウインドウファンクションを使って累積を取得するほうが良いので、使える時はこちらを使ってくださいね！</description><pubDate>Wed, 11 Jul 2018 23:20:00 GMT</pubDate><category>便利なT-SQL＆クエリー集</category></item>
<item><title>T-SQL: 数値型や日付型かどうかを確認して変換する方法</title><link>https://sql55.com/query/try-cast-try-convert.php</link><description>T-SQL: 数値型や日付型かどうかを確認して変換する方法&lt;br&gt; 0      0 　　　　&lt;br&gt;&lt;br&gt; &lt;br&gt;数値型や日付型かどうかを確認して変換する&lt;br&gt;クエリーを書いていると、文字列の値が数値型や日付型かどうかを確認して、有効な場合はそれぞれの型に変換したいような時がありますよね。&lt;br&gt;&lt;br&gt;今回はそんな時に便利な関数とクエリーをご紹介します。&lt;br&gt;&lt;br&gt;&lt;br&gt;TRY_CAST や TRY_CONVERT を使う方法&lt;br&gt;もし、SQL Server のバージョンが 2012 以降なのであれば、簡単なのは TRY_CAST と TRY_CONVERT を使う方法です。&lt;br&gt;&lt;br&gt;構文は次の通りで、それぞれ CAST や CONVERT と同じで、ファンクション名に TRY_ がつくだけです。&lt;br&gt;&lt;br&gt;TRY_CAST ( 変換する値 AS データ型 [ ( 長さ ) ] )  &lt;br&gt;&lt;br&gt;TRY_CONVERT ( データ型 [ ( 長さ ) ] , 変換する値 [ , スタイル ] ) &lt;br&gt;CAST と CONVERT は変換が失敗した時にエラーになりますが、TRY_CAST と TRY_CONVERT は変換が失敗すると NULL を返します。&lt;br&gt;&lt;br&gt;&lt;br&gt;それでは実際に使ってみましょう。&lt;br&gt;&lt;br&gt;次のような MONEY 型に変換したい NVARCHAR(20) 型の @InputNumberString1 と　@InputNumberString2 と、DATE 型に変換したい @InputDateString1 と @InputDateString2 があるとします。&lt;br&gt;&lt;br&gt;それぞれ 1 で終わる変数は変換に失敗する値、2 は変換に成功する値が入っています。&lt;br&gt;&lt;br&gt;これらの値を TRY_CAST、TRY_CONVERT を使って変換すると次のようになります。&lt;br&gt;&lt;br&gt;DECLARE @InputNumberString1 NVARCHAR(20) = N&#039;2500円&#039;, -- Invalid&lt;br&gt;	@InputNumberString2 NVARCHAR(20) = N&#039;3500&#039;,	  -- Valid&lt;br&gt;	@InputDateString1   NVARCHAR(20) = N&#039;2019-02-29&#039;, -- Invalid&lt;br&gt;	@InputDateString2   NVARCHAR(20) = N&#039;2019-02-28&#039;; -- Valid&lt;br&gt;&lt;br&gt;SELECT	TRY_CAST(@InputNumberString1 AS MONEY) AS Price1,&lt;br&gt;	TRY_CAST(@InputNumberString2 AS MONEY) AS Price2,&lt;br&gt;	TRY_CONVERT(DATE, @InputDateString1) AS Date1,&lt;br&gt;	TRY_CONVERT(DATE, @InputDateString2) AS Date2;&lt;br&gt;数値型や日付型かどうかを確認して変換する方法 1&lt;br&gt;&lt;br&gt;変換できない値はエラーにならずに NULL が返っていますね！&lt;br&gt;&lt;br&gt;&lt;br&gt;ISNUMERIC や ISDATE でチェックしてから変換する&lt;br&gt;SQL Server のバージョンが 2012 より前のバージョンの場合は、TRY_CAST や TRY_CONVERT がないので、エラーを出さない為には変換する前に、値が有効か自分でチェックしなければなりません。&lt;br&gt;&lt;br&gt;値が数値型として有効かどうかを調べるには ISNUMERIC(値) を、日付型として有効かどうかを調べるには ISDATE(値) を使うことができます。&lt;br&gt;&lt;br&gt;両方の関数とも、有効な場合は 1 を、そうでない場合は 0 を返します。&lt;br&gt;&lt;br&gt;&lt;br&gt;先ほどと同様の値をISNUMERIC や ISDATE でチェックしてから変換してみましょう。&lt;br&gt;&lt;br&gt;DECLARE @InputNumberString1 NVARCHAR(20) = N&#039;2500円&#039;, -- Invalid&lt;br&gt;	@InputNumberString2 NVARCHAR(20) = N&#039;3500&#039;, -- Valid&lt;br&gt;	@InputDateString1   NVARCHAR(20) = N&#039;2019-02-29&#039;, -- Invalid&lt;br&gt;	@InputDateString2   NVARCHAR(20) = N&#039;2019-02-28&#039;; -- Valid&lt;br&gt;&lt;br&gt;SELECT	CASE &lt;br&gt;	   WHEN ISNUMERIC(@InputNumberString1) = 1 &lt;br&gt;	      THEN CAST(@InputNumberString1 AS MONEY)&lt;br&gt;	      ELSE NULL&lt;br&gt;	END AS Price1,&lt;br&gt;	CASE &lt;br&gt;	   WHEN ISNUMERIC(@InputNumberString2) = 1 &lt;br&gt;	      THEN CAST(@InputNumberString2 AS MONEY)&lt;br&gt;	      ELSE NULL&lt;br&gt;	END AS Price2,&lt;br&gt;	CASE &lt;br&gt;	   WHEN ISDATE(@InputDateString1) = 1 &lt;br&gt;	      THEN CONVERT(DATE, @InputDateString1)&lt;br&gt;	      ELSE NULL&lt;br&gt;	END AS Date1,&lt;br&gt;	CASE &lt;br&gt;	   WHEN ISDATE(@InputDateString2) = 1 &lt;br&gt;	      THEN CONVERT(DATE, @InputDateString2)&lt;br&gt;	      ELSE NULL&lt;br&gt;	END AS Date2;&lt;br&gt;数値型や日付型かどうかを確認して変換する方法 2&lt;br&gt;&lt;br&gt;先ほどと同様の結果が得られましたね。&lt;br&gt;&lt;br&gt;今回の例では、数値型に CAST、日付型に CONVERT を使っていますが、特に意味はなく CAST と CONVERT を両方使いたかったからだけで、どちらを使っても大丈夫です！&lt;br&gt;&lt;br&gt;&lt;br&gt;TRY_CAST や TRY_CONVERT が使える時は、できるだけ使ったほうがシンプルですし良いですね。&lt;br&gt;&lt;br&gt;ただ、TRY_CAST や TRY_CONVERT でも、明示的に許可されない型を変換をしようとするとエラーになります。&lt;br&gt;&lt;br&gt;現状、NVARCHAR から明示的に許可されない変換は IMAGE 型へだけだと思いますが、その他についてはマイクロソフトの 「 CAST および CONVERT のページ 」 の 「 暗黙的な変換 」 の表で確認してみてください。&lt;br&gt;&lt;br&gt;&lt;br&gt;また、確実に変換する値が有効なことがわかっている場合は、TRY_CAST や TRY_CONVERT ではなく、CAST や CONVERT を使ったほうがパフォーマンス的に良いので、そうしてくださいね！</description><pubDate>Mon, 09 Jul 2018 22:41:00 GMT</pubDate><category>便利なT-SQL＆クエリー集</category></item>
<item><title>SQL Server でクエリー結果をページングする方法</title><link>https://sql55.com/query/paging-query-results.php</link><description>SQL Server でクエリー結果をページングする方法&lt;br&gt; 0      0 　　　　&lt;br&gt;&lt;br&gt; &lt;br&gt;SQL Server でクエリー結果をページングする&lt;br&gt;ウエブシステム等の開発をしていると、検索結果をページに分けて表示するために、ページング処理が必要になってくることがあると思います。&lt;br&gt;&lt;br&gt;MySQL では LIMIT を使えば簡単にできるページングですが、 SQL Server には LIMIT がありません。&lt;br&gt;&lt;br&gt;今回は SQL Server でどのようにクエリー結果を効率よくページングすることができるのかをご紹介します。&lt;br&gt;&lt;br&gt;&lt;br&gt;ORDER BY 句 で OFFSET と FETCH を使う方法&lt;br&gt;もし、SQL Server のバージョンが 2012 以降なのであれば、一番効率の良い方法は SELECT ステートメントの ORDER BY 句 で OFFSET と FETCH を使う方法です。&lt;br&gt;&lt;br&gt;構文は次の通りです。&lt;br&gt;&lt;br&gt;ORDER BY [通常の ORDER BY 句と同様にソート順を指定する]&lt;br&gt;   OFFSET [スキップするレコードの数] ROWS  &lt;br&gt;   FETCH NEXT [取得するレコードの数] ROWS ONLY; &lt;br&gt;&lt;br&gt;それでは実際に使ってみましょう。 次のような Person テーブルがあります。&lt;br&gt;&lt;br&gt;SQL Server でクエリー結果をページングする方法 1&lt;br&gt;&lt;br&gt;&lt;br&gt;このクエリー結果を、各ページ 10 レコードずつ表示するとして、3 ページ目に表示される結果を取得したい場合は次のように取得することができます。&lt;br&gt;&lt;br&gt;DECLARE @NumberOfRowsPerPage INT = 10,&lt;br&gt;	@PageNumber INT = 3;&lt;br&gt;&lt;br&gt;DECLARE @OffsetRowCount INT = (@PageNumber - 1) * @NumberOfRowsPerPage;&lt;br&gt;&lt;br&gt;SELECT	PersonID,&lt;br&gt;	FirstName,&lt;br&gt;	MiddleName,&lt;br&gt;	LastName&lt;br&gt;FROM	Person&lt;br&gt;ORDER BY PersonID&lt;br&gt;   OFFSET @OffsetRowCount ROWS  &lt;br&gt;   FETCH NEXT @NumberOfRowsPerPage ROWS ONLY;  &lt;br&gt;SQL Server でクエリー結果をページングする方法 2&lt;br&gt;&lt;br&gt; 実際に使う時は検索条件を WHERE 句で指定したり、名前などでソートしたりするかと思いますが、今回は正しく取得されていることがわかるようにフィルターはせず、行番号と同じ値にしてある PersonID でソートしています。&lt;br&gt;OFFSET に続いてスキップしたいレコード数を [3 - 1 ページ分] x [1 ページのレコード数: 10] を計算して指定して、FETCH NEXT に続いて取得したいレコード数 [1 ページのレコード数: 10] を指定しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;ROW_NUMBER() とサブクエリーを使う方法&lt;br&gt;SQL Server 2012 より前バージョンで SQL Server 2005 以降では ROW_NUMBER() とサブクエリーを使って、ページングをすることができます。&lt;br&gt;&lt;br&gt;まず ROW_NUMBER() とサブクエリーを使って、各ページ 10 レコードずつ表示するとして、3 ページ目に表示される結果を取得するクエリーは以下の通りです。&lt;br&gt;&lt;br&gt;DECLARE @NumberOfRowsPerPage INT = 10,&lt;br&gt;	@PageNumber INT = 3;&lt;br&gt;&lt;br&gt;DECLARE	@StartRowNo INT = ((@PageNumber - 1) * @NumberOfRowsPerPage) + 1,&lt;br&gt;	@EndRowNo   INT = @PageNumber * @NumberOfRowsPerPage;&lt;br&gt;		&lt;br&gt;SELECT	PersonID,&lt;br&gt;	FirstName,&lt;br&gt;	MiddleName,&lt;br&gt;	LastName  &lt;br&gt;FROM &lt;br&gt;    (SELECT ROW_NUMBER() OVER (ORDER BY PersonID) AS RowNo,&lt;br&gt;	    PersonID,&lt;br&gt;	    FirstName,&lt;br&gt;	    MiddleName,&lt;br&gt;	    LastName  &lt;br&gt;     FROM   Person) AS P&lt;br&gt;WHERE	RowNo BETWEEN @StartRowNo AND @EndRowNo&lt;br&gt;ORDER BY PersonID;&lt;br&gt;SQL Server でクエリー結果をページングする方法 3&lt;br&gt;&lt;br&gt;先に、開始の @StartRowNo と 終了の @EndRowNo を計算しておき、サブクエリーの中で ROW_NUMBER() で取得したいソート順で RowNo を振り WHERE 句でフィルターしています。&lt;br&gt;&lt;br&gt;また、ほぼ同じような方法で、サブクエリーの代わりに共通テーブル式（CTE）を使っても取得可能です。&lt;br&gt;&lt;br&gt;&lt;br&gt;SQL Server でのページングについては、方法とパフォーマンスを比較した記事が多数あります。&lt;br&gt;&lt;br&gt;だいたいの結果としては、ROW_NUMBER() &amp; サブクエリーと、ROW_NUMBER() &amp; 共通テーブル式（CTE）はいい勝負、使えるなら OFFSET &amp; FETCH を使っておけば間違いないようです。&lt;br&gt;&lt;br&gt;特にクエリー結果の返すレコード数が多い時は OFFSET &amp; FETCH のパフォーマンスが良く、その他の差が大きく開いていました。&lt;br&gt;&lt;br&gt;ご参考になれば幸いです！</description><pubDate>Tue, 19 Jun 2018 21:19:00 GMT</pubDate><category>便利なT-SQL＆クエリー集</category></item>
<item><title>SQL Server Management Studio - インテリセンスに変更が反映されない時の更新方法</title><link>https://sql55.com/sql-server/ssms-refresh-intelli-sense.php</link><description>SQL Server Management Studio - インテリセンスに変更が反映されない時の更新方法&lt;br&gt; &lt;br&gt;SQL Server Management Studio のインテリセンスとは？&lt;br&gt;SQL Server Management Studio のクエリエディターでは、入力時の補助をしてくれる IntelliSense （インテリセンス） がデフォルトで ON になっています。&lt;br&gt;&lt;br&gt;例えば、次のように　FROM に続けて TestR まで入力すると、TestR という文字が含まれた構文要素の候補が表示されます。&lt;br&gt;&lt;br&gt;インテリセンス 1&lt;br&gt;&lt;br&gt;カラム名も同様です。 文字を入力していくとフィルターされて候補が絞られていき、候補から選択することで入力も可能です。&lt;br&gt;&lt;br&gt;インテリセンス 2&lt;br&gt;&lt;br&gt;SELECT 文などのカラム名の上にカーソルを持ってくると、そのカラムのデータ型や NULL が許可されているのか等を確認することもできます。&lt;br&gt;&lt;br&gt;インテリセンス 3&lt;br&gt;&lt;br&gt;また構文や要素などが間違っている箇所には赤線を出してくれ、カーソルを合わせるとエラーの内容が表示されます。&lt;br&gt;&lt;br&gt;インテリセンス 4&lt;br&gt;&lt;br&gt;T-SQL の全ての構文や要素がサポートされているわけではありませんが、主要なものはサポートされているので、便利な機能です。&lt;br&gt;&lt;br&gt; IntelliSense （インテリセンス） は SQL Server 2008 以降の SQL Server Managment Studio で、 SQL Server 2008 以降のインスタンスに接続している時のみサポートされます。&lt;br&gt;&lt;br&gt;インテリセンスがうまく動かない時がある&lt;br&gt;そんな便利なインテリセンスですが、たまに思うように動いてくれない時があります。&lt;br&gt;&lt;br&gt;まずカーソルよりも上のほうでコードにエラーがある時は、うまく動いてくれません。 エラーがある時は仕方がないのでエラーを直しましょう。&lt;br&gt;&lt;br&gt;&lt;br&gt;よく起こる困ったケースは、現在のクエリエディターを開いた後のデータベースオブジェクトへの変更が、インテリセンスに自動的に反映されないことです。&lt;br&gt;&lt;br&gt;クエリーエディタを開いた後に追加した、テーブルやカラム、ユーザー定義ファンクションやストアードプロシージャなどが候補に出てきません。&lt;br&gt;&lt;br&gt;また、追加したカラム名を使おうをしてもエラーの赤線が出てしまったりすることがあります。&lt;br&gt;&lt;br&gt;&lt;br&gt;例えば、以下のケースはクエリーエディターを開いたあとで Student テーブルに MiddleName カラムを追加したので、本当はエラーではありませんが、赤線が出ています。&lt;br&gt;&lt;br&gt;インテリセンス 5&lt;br&gt;&lt;br&gt;&lt;br&gt;インテリセンスを最新の状態に更新する&lt;br&gt;そんな時はインテリセンスを最新の状態に更新しましょう。&lt;br&gt;&lt;br&gt;以下のように、メニューから [編集] &gt; [IntelliSense] &gt; [ローカルキャッシュの更新] をクリックすると、インテリセンスを最新の状態に更新されます。&lt;br&gt;&lt;br&gt;ショートカットキーの Ctrl + Shift + R でも更新可能です。&lt;br&gt;&lt;br&gt;インテリセンス 6&lt;br&gt;&lt;br&gt;インテリセンスを最新の状態に更新されて、MiddleName の赤線がなくなり、候補にも出てくるようになりましたね。&lt;br&gt;&lt;br&gt;インテリセンス 7</description><pubDate>Fri, 15 Jun 2018 23:18:00 GMT</pubDate><category>Microsoft SQL Server 入門</category></item>
<item><title>T-SQL: SEQUENCE を使って連続したシーケンス番号を振る方法</title><link>https://sql55.com/query/how-to-use-sequence-2.php</link><description>T-SQL: SEQUENCE を使って連続したシーケンス番号を振る方法&lt;br&gt;&lt;br&gt; &lt;br&gt;SEQUENCE を使って連続したシーケンス番号を振る方法&lt;br&gt;前回　「 SEQUENCE を使ってシーケンス番号を振る方法 」 では、SEQUENCE オブジェクトを生成し、NEXT VALUE FOR を使ってシーケンス番号を生成してみました。&lt;br&gt;&lt;br&gt;NEXT VALUE FOR を使ってシーケンス番号を生成すると、もし他のプロセスも同時にシーケンス番号を生成していた場合、番号が飛び飛びになる可能性があります。&lt;br&gt;&lt;br&gt;どうしても番号が飛んでほしくない時は sp_sequence_get_range を使って、シーケンス番号を一度にまとめて取得することができます。&lt;br&gt;&lt;br&gt;今回は、sp_sequence_get_range　を使ってシーケンス番号を一度にまとめて取得して利用する方法をご紹介します。&lt;br&gt;&lt;br&gt; SEQUENCE オブジェクトは SQL Server 2012 以降で利用可能です。&lt;br&gt;&lt;br&gt;SEQUENCE オブジェクトを生成する&lt;br&gt;今回使用する 「 1 から始まって 1 ずつ増える SEQUENCE オブジェクト 」　の TestSequence2 を以下のスクリプトを実行して作成しておきます。&lt;br&gt;&lt;br&gt;CREATE SEQUENCE TestSequence2&lt;br&gt;    START WITH 1;&lt;br&gt;詳しくは SEQUENCE を使ってシーケンス番号を振る方法 をご覧ください。&lt;br&gt;&lt;br&gt;&lt;br&gt;連続したシーケンス番号を生成する&lt;br&gt;生成した SEQUENCE オブジェクトから連続したシーケンス番号を生成するには sp_sequence_get_range というシステム・ストアドプロシージャを使います。&lt;br&gt;&lt;br&gt;sp_sequence_get_range の構文は以下の通りです。&lt;br&gt;&lt;br&gt;sp_sequence_get_range [ @sequence_name = ] N&#039;&lt;sequence&gt;&#039;   &lt;br&gt;     , [ @range_size = ] range_size  &lt;br&gt;     , [ @range_first_value = ] range_first_value OUTPUT   &lt;br&gt;    [, [ @range_last_value = ] range_last_value OUTPUT ]  &lt;br&gt;    [, [ @range_cycle_count = ] range_cycle_count OUTPUT ]  &lt;br&gt;    [, [ @sequence_increment = ] sequence_increment OUTPUT ]  &lt;br&gt;    [, [ @sequence_min_value = ] sequence_min_value OUTPUT ]  &lt;br&gt;    [, [ @sequence_max_value = ] sequence_max_value OUTPUT ]  &lt;br&gt;    [ ; ]  &lt;br&gt;sequence_name: 番号を取得するシーケンスオブジェクト名&lt;br&gt;range_size: 番号を何個取得するか&lt;br&gt;range_first_value: 最初シーケンス番号の値&lt;br&gt;range_last_value: 最後のシーケンス番号の値&lt;br&gt;range_cycle_count: 今回シーケンス番号を取得するのに何回サイクルしたか&lt;br&gt;sequence_increment: 指定したシーケンスオブジェクトのインクリメント&lt;br&gt;sequence_min_value: 指定したシーケンスオブジェクトの最小値&lt;br&gt;sequence_max_value: 指定したシーケンスオブジェクトの最大値&lt;br&gt;いろいろありますが、必須なのは最初の 3 つだけです。&lt;br&gt;&lt;br&gt;&lt;br&gt;それでは、実際にsp_sequence_get_range を使って、連続したシーケンス番号を取得してみましょう。&lt;br&gt;&lt;br&gt;先ほど生成した TestSequence2 から、連続したシーケンス番号を 6 個取得するクエリーは次の通りです。&lt;br&gt;&lt;br&gt;DECLARE @size BIGINT = 6,&lt;br&gt;	@first_value SQL_VARIANT,&lt;br&gt;	@last_value SQL_VARIANT;&lt;br&gt;&lt;br&gt;EXEC sys.sp_sequence_get_range &lt;br&gt;	@sequence_name = N&#039;dbo.TestSequence2&#039;,&lt;br&gt;	@range_size = @size,&lt;br&gt;	@range_first_value = @first_value OUTPUT,&lt;br&gt;	@range_last_value = @last_value OUTPUT;&lt;br&gt;&lt;br&gt;SELECT @first_value AS FirstValue,&lt;br&gt;       @last_value AS LastValue;&lt;br&gt;SEQUENCE を使って連続したシーケンス番号を振る方法 1&lt;br&gt;&lt;br&gt;@first_value と @last_value はシーケンスオブジェクトの定義によって返ってくる型が違いますので、SQL_VARIANT 型で定義しておきます。&lt;br&gt;&lt;br&gt;TestSequence2 は 1 ずつ増えるシーケンスオブジェクトなので @first_value の 1 から @last_value の 6 までの連続したシーケンス番号を TestSequence2 から取得したことになります。&lt;br&gt;&lt;br&gt;&lt;br&gt;前回、SEQUENCE を使ってシーケンス番号を振る方法でご紹介した、NEXT VALUE FORを使った、ST + 8 桁の数字となる学生番号の生成を、sp_sequence_get_range を使ってやってみましょう。&lt;br&gt;&lt;br&gt;1 から始まり、1　ずつ増えて、MAXVALUE が 99999999 となる StudentNoSequence2 シーケンスを生成しておきます。&lt;br&gt;&lt;br&gt;CREATE SEQUENCE StudentNoSequence2&lt;br&gt;    START WITH 1&lt;br&gt;    MAXVALUE 99999999;&lt;br&gt;&lt;br&gt;そして、次のようなクエリーで学生番号を生成し、Student テーブルの StudentNo カラムの値を更新することができます。&lt;br&gt;&lt;br&gt;DECLARE @size BIGINT = 6,&lt;br&gt;	@first_value SQL_VARIANT,&lt;br&gt;	@last_value SQL_VARIANT;&lt;br&gt;&lt;br&gt;EXEC sys.sp_sequence_get_range &lt;br&gt;	@sequence_name = N&#039;dbo.StudentNoSequence2&#039;,&lt;br&gt;	@range_size = @size,&lt;br&gt;	@range_first_value = @first_value OUTPUT,&lt;br&gt;	@range_last_value = @last_value OUTPUT;&lt;br&gt;-------------------------------------------------------------&lt;br&gt;SELECT @first_value AS FirstValue,&lt;br&gt;       @last_value AS LastValue;&lt;br&gt;&lt;br&gt;DECLARE @base_seq_no BIGINT = CAST(@first_value AS BIGINT) - 1; &lt;br&gt;-------------------------------------------------------------&lt;br&gt;UPDATE S1&lt;br&gt;SET    S1.StudentNo = S2.StudentNo&lt;br&gt;FROM   Student AS S1&lt;br&gt;         INNER JOIN&lt;br&gt;            (SELECT &#039;ST&#039; + &lt;br&gt;                    RIGHT(&lt;br&gt;                       &#039;00000000&#039; + &lt;br&gt;                        CAST(&lt;br&gt;                         @base_seq_no&lt;br&gt;			 + &lt;br&gt;			 ROW_NUMBER() OVER (ORDER BY LastName, &lt;br&gt;						     FirstName)&lt;br&gt;                       AS NVARCHAR)&lt;br&gt;                    , 8) AS StudentNo,&lt;br&gt;                    StudentID&lt;br&gt;             FROM   Student) AS S2&lt;br&gt;         ON S1.StudentID = S2.StudentID;&lt;br&gt;-------------------------------------------------------------&lt;br&gt;SELECT * FROM Student;&lt;br&gt;SEQUENCE を使って連続したシーケンス番号を振る方法 2&lt;br&gt;&lt;br&gt;まず、sp_sequence_get_range を実行して、6 個分のシーケンス番号を確保し、開始のシーケンス番号 @first_value を取得します。&lt;br&gt;&lt;br&gt;@last_value は参考の為に取得していますが使用していません。&lt;br&gt;&lt;br&gt;@first_value は SQL_VARIANT 型なので BIGINT にキャストし、マイナス 1 してベースとなる番号を @base_seq_no として取得しておきます。&lt;br&gt;&lt;br&gt;次に、Student のレコードに LastName, FirstName 順で ROW_NUMBER() を使って連番を振り、@base_seq_no に追加することによって、シーケンス番号を決定しています。&lt;br&gt;&lt;br&gt;決定したシーケンス番号を NVARCHAR にキャストし、左側に 0 を 8 個追加して RIGHT 関数で右から 8 桁取得することによって左側をゼロパディングし、頭に &#039;ST&#039; を追加して学生番号を生成しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;確実に連続したシーケンス番号を振りたい時には NEXT VALUE FOR ではなく sp_sequence_get_range を使ってくださいね！</description><pubDate>Mon, 04 Jun 2018 22:24:00 GMT</pubDate><category>便利なT-SQL＆クエリー集</category></item>
<item><title>T-SQL: SEQUENCE を使ってシーケンス番号を振る方法</title><link>https://sql55.com/query/how-to-use-sequence.php</link><description>T-SQL: SEQUENCE を使ってシーケンス番号を振る方法&lt;br&gt;&lt;br&gt; &lt;br&gt;SEQUENCE を使ってシーケンス番号を振る&lt;br&gt;商品番号、発注番号、学生番号などなど、システム開発をしていると、レコードを特定する ID 番号のほかにも、シーケンス番号を使って一意となる番号を生成したい時がありますよね。&lt;br&gt;&lt;br&gt;今回は SQL Server 2012 から使える SEQUENCE オブジェクトを使って、シーケンス番号を生成する方法をご紹介します。&lt;br&gt;&lt;br&gt;&lt;br&gt;SEQUENCE オブジェクトを生成する&lt;br&gt;SEQUENCE オブジェクトを使うと、指定したルールにしたがって数字のシーケンス番号を生成することができます。&lt;br&gt;&lt;br&gt;SEQUENCE オブジェクトを生成する構文は以下の通りです。&lt;br&gt;&lt;br&gt;CREATE SEQUENCE [スキーマ名 . ] シーケンス名&lt;br&gt;    [ AS &lt;整数のデータ型&gt; ]  &lt;br&gt;    [ START WITH &lt;整数&gt; ]  &lt;br&gt;    [ INCREMENT BY &lt;整数&gt; ]  &lt;br&gt;    [ { MINVALUE [ &lt;整数&gt; ] } | { NO MINVALUE } ]  &lt;br&gt;    [ { MAXVALUE [ &lt;整数&gt; ] } | { NO MAXVALUE } ]  &lt;br&gt;    [ CYCLE | { NO CYCLE } ]  &lt;br&gt;    [ { CACHE [ &lt;整数&gt; ] } | { NO CACHE } ]  &lt;br&gt;    [ ; ]  &lt;br&gt;何もオプションを指定しないと次のようなデフォルトの値が使われます。&lt;br&gt;&lt;br&gt;AS -&gt; BIGINT&lt;br&gt;START WITH -&gt; BIGINT の最小値&lt;br&gt;INCREMENT BY -&gt; 1 ずつ増える&lt;br&gt;NO MINVALUE -&gt; BIGINT の最小値&lt;br&gt;NO MAXVALUE -&gt; BIGINT の最大値&lt;br&gt;NO CYCLE -&gt; サイクルしない&lt;br&gt;CACHE -&gt; キャッシュする&lt;br&gt;全て必須項目はないですが、オプションを何も指定しないでシーケンスオブジェクトを生成してシーケンス番号を生成すると、最初に生成される番号が 「-9223372036854775808」 になってしまい、使いにくいです。&lt;br&gt;&lt;br&gt;ですので少なくとも START WITH は指定したほうが良いと思います。&lt;br&gt;&lt;br&gt;INCREMENT BY にはマイナスの値も設定可能で、その場合は最大値から最小値に向かって、降順のシーケンス番号が生成されます。&lt;br&gt;&lt;br&gt;利用する時ですが、シーケンス番号はトランザクションの範囲外で生成されるので、IDENTITY と同様に、たとえトランザクションをロールバックしてもカウンターは戻りません。&lt;br&gt;&lt;br&gt;&lt;br&gt;それでは、実際に SEQUENCE オブジェクトを生成してみましょう。&lt;br&gt;&lt;br&gt;1 から始まるシーケンスオブジェクトは次のように生成することができます。&lt;br&gt;&lt;br&gt;CREATE SEQUENCE TestSequence&lt;br&gt;    START WITH 1;&lt;br&gt;できた SEQUENCE オブジェクトは、SQL Management Studio のオブジェクトエクスプローラで、該当のデータベースの下の[プログラミング] &gt; [シーケンス]で確認することができます。&lt;br&gt;&lt;br&gt;SEQUENCE を使ってシーケンス番号を振る方法 1&lt;br&gt;&lt;br&gt;&lt;br&gt;シーケンス番号を生成する&lt;br&gt;生成した SEQUENCE オブジェクトからシーケンス番号を生成するには NEXT VALUE FOR を使います。&lt;br&gt;&lt;br&gt;NEXT VALUE FOR はテーブルの既定の制約や、SELECT ステートメント、INSERT ステートメントなどいろいろな状況で使うことができます。&lt;br&gt;&lt;br&gt;&lt;br&gt;例えば TestSequence から、シーケンス番号を生成して変数に代入するクエリーは次の通りです。&lt;br&gt;&lt;br&gt;DECLARE @SeqNo1 BIGINT = NEXT VALUE FOR TestSequence;&lt;br&gt;DECLARE @SeqNo2 BIGINT = NEXT VALUE FOR TestSequence;&lt;br&gt;&lt;br&gt;SELECT	@SeqNo1 AS Seq1,&lt;br&gt;	@SeqNo2 AS Seq2;&lt;br&gt;SEQUENCE を使ってシーケンス番号を振る方法 2&lt;br&gt;&lt;br&gt;&lt;br&gt;複数のレコードを返すクエリーに、順位付け関数と共にシーケンス番号を生成することも可能です。&lt;br&gt;&lt;br&gt;例えば、 次のようなクエリーで Student テーブルのレコードを LastName、FirstName の順番でソートして、シーケンス番号を振ることができます。&lt;br&gt;&lt;br&gt;SEQUENCE を使ってシーケンス番号を振る方法 3&lt;br&gt;&lt;br&gt;SELECT	NEXT VALUE FOR TestSequence &lt;br&gt;		OVER (ORDER BY LastName, FirstName) AS SeqNo,  &lt;br&gt;	*&lt;br&gt;FROM	Student;&lt;br&gt;&lt;br&gt;SEQUENCE を利用して学生番号を振る&lt;br&gt;これを利用して、ST + 8 桁の数字となる学生番号を振ってみましょう。&lt;br&gt;&lt;br&gt;数字の部分は 8 桁が最高にしたいので MAXVALUE が 99999999 となる StudentNoSequence 次のようなシーケンスを生成しておきます。&lt;br&gt;&lt;br&gt;CREATE SEQUENCE StudentNoSequence&lt;br&gt;    START WITH 1&lt;br&gt;    MAXVALUE 99999999;&lt;br&gt;&lt;br&gt;そして、次のようなクエリーで学生番号を生成し、Student テーブルの StudentNo カラムの値を更新することができます。&lt;br&gt;&lt;br&gt;UPDATE S1&lt;br&gt;SET    S1.StudentNo = S2.StudentNo&lt;br&gt;FROM   Student AS S1&lt;br&gt;         INNER JOIN&lt;br&gt;            (SELECT &#039;ST&#039; + &lt;br&gt;                    RIGHT(&lt;br&gt;                       &#039;00000000&#039; + &lt;br&gt;                        CAST(&lt;br&gt;                          NEXT VALUE FOR StudentNoSequence &lt;br&gt;                             OVER (ORDER BY LastName, FirstName) &lt;br&gt;                       AS NVARCHAR)&lt;br&gt;                    , 8) AS StudentNo,&lt;br&gt;                    StudentID&lt;br&gt;             FROM   Student) AS S2&lt;br&gt;         ON S1.StudentID = S2.StudentID;&lt;br&gt;SEQUENCE を使ってシーケンス番号を振る方法 4&lt;br&gt;&lt;br&gt;&lt;br&gt;学生番号を生成している箇所は緑で囲まれた部分です。&lt;br&gt;&lt;br&gt;LastName, FirstName 順に生成したシーケンス番号を NVARCHAR 型に変換し、左側に 0 を 8 個追加して RIGHT 関数で右から 8 桁取得することによって左側をゼロパディングし、頭に &#039;ST&#039; を追加しています。&lt;br&gt;&lt;br&gt;&lt;br&gt;この方法ですと、もし他のプロセスも同時にシーケンス番号を生成していた場合、番号が飛び飛びになる可能性があります。&lt;br&gt;&lt;br&gt;どうしても番号が飛んでほしくない時は sp_sequence_get_range を使って、シーケンス番号を一度にまとめて取得することも可能です。&lt;br&gt;&lt;br&gt;sp_sequence_get_range の使い方は、また次回ご説明させていただきますね！</description><pubDate>Fri, 01 Jun 2018 17:49:00 GMT</pubDate><category>便利なT-SQL＆クエリー集</category></item>
<item><title>T-SQL: 改行を挟んで複数行の文字列を結合する</title><link>https://sql55.com/query/concatenate-string-values-with-carriage-returns.php</link><description>T-SQL: 改行を挟んで複数行の文字列を結合する&lt;br&gt;&lt;br&gt; &lt;br&gt;複数行の文字列を結合してひとつの文字列にする&lt;br&gt;1 対 n となる親子関係のあるテーブルがあって、親テーブルの結果と共に、子テーブルの文字列を結合して、ひとつの文字列として返したいようなケースありますよね。&lt;br&gt;&lt;br&gt;文字列を結合する際には、カンマやスペース等の区切り文字を入れることが多いかと思います。&lt;br&gt;&lt;br&gt;今回は区切り文字として改行を挿入して文字列を結合する方法をご紹介します。&lt;br&gt;&lt;br&gt;&lt;br&gt;改行を挟んで文字列を結合する方法&lt;br&gt;例えば、次のような親子関係の Company テーブルと CompanyBranch テーブルがあります。&lt;br&gt;&lt;br&gt;改行を挟んで複数行の文字列を結合する 1&lt;br&gt;&lt;br&gt;改行を挟んで複数行の文字列を結合する 2&lt;br&gt;&lt;br&gt;CREATE TABLE Company (&lt;br&gt;   CompanyID INT NOT NULL PRIMARY KEY,&lt;br&gt;   CompanyCode VARCHAR(50) NOT NULL,&lt;br&gt;   CompanyName VARCHAR(50) NOT NULL&lt;br&gt;);&lt;br&gt;&lt;br&gt;INSERT INTO Company&lt;br&gt;  (CompanyID, CompanyCode, CompanyName)&lt;br&gt; VALUES&lt;br&gt;  (1, &#039;AAA&#039;, &#039;AAA Company&#039;),&lt;br&gt;  (2, &#039;BBB&#039;, &#039;BBB Company&#039;),&lt;br&gt;  (3, &#039;CCC&#039;, &#039;CCC Company&#039;);&lt;br&gt;&lt;br&gt; CREATE TABLE CompanyBranch (&lt;br&gt;   CompanyBranchID INT NOT NULL PRIMARY KEY,&lt;br&gt;   CompanyID INT NOT NULL,&lt;br&gt;   BranchCode VARCHAR(50) NOT NULL,&lt;br&gt;   BranchName VARCHAR(50) NOT NULL,&lt;br&gt;   CONSTRAINT FK_CompanyBranch FOREIGN KEY (CompanyID) REFERENCES Company(CompanyID)&lt;br&gt;);&lt;br&gt;&lt;br&gt;INSERT INTO CompanyBranch&lt;br&gt;  (CompanyBranchID, CompanyID, BranchCode, BranchName)&lt;br&gt; VALUES&lt;br&gt;  (1, 1, &#039;LA&#039;, &#039;LA Branch&#039;),&lt;br&gt;  (2, 1, &#039;NY&#039;, &#039;NY Branch&#039;),&lt;br&gt;  (3, 1, &#039;SF&#039;, &#039;SF Branch&#039;),&lt;br&gt;  (4, 2, &#039;HW&#039;, &#039;HW Branch&#039;),&lt;br&gt;  (5, 3, &#039;SD&#039;, &#039;SD Branch&#039;),&lt;br&gt;  (6, 3, &#039;FL&#039;, &#039;FL Branch&#039;);&lt;br&gt;&lt;br&gt;Company テーブルの情報に加えて、CompanyBranch の情報を BranchList カラム として [BranchCode]: [Branch Name] を改行文字でつなげて取得してみましょう。&lt;br&gt;&lt;br&gt;やり方はいろいろあると思いますが、例えばこんな感じでできると思います。&lt;br&gt;&lt;br&gt;SELECT	CompanyID,&lt;br&gt;	CompanyCode,&lt;br&gt;	CompanyName,&lt;br&gt;	REPLACE(&lt;br&gt;	    STUFF((SELECT &#039;|||&#039; + CB.BranchCode + &#039;: &#039; + CB.BranchName&lt;br&gt;		   FROM		CompanyBranch AS CB WITH (NOLOCK)&lt;br&gt;		   WHERE	CB.CompanyID = C.CompanyID&lt;br&gt;		   ORDER BY	CB.BranchCode&lt;br&gt;		   FOR XML PATH (&#039;&#039;), TYPE).value(&#039;.&#039;, &#039;NVARCHAR(MAX)&#039;), 1, 3, &#039;&#039;),&lt;br&gt;	&#039;|||&#039;, CHAR(13) + CHAR(10)) AS BranchList&lt;br&gt;FROM	Company	AS C;&lt;br&gt;T-SQL - 文字列に改行を挿入する 3&lt;br&gt;&lt;br&gt;SQL Server Management Studio の結果のグリッドではわかりにくいかもしれませんが、結果をテキストに表示するとこうなります。&lt;br&gt;&lt;br&gt;T-SQL - 文字列に改行を挿入する 4&lt;br&gt;&lt;br&gt;これを C# などで Excel のセルに値を出力するとこんな感じの表を出力することができます。&lt;br&gt;&lt;br&gt;T-SQL - 文字列に改行を挿入する 5&lt;br&gt;&lt;br&gt;&lt;br&gt;結果を確認したところで、どのように BranchList を生成したかをご説明します。&lt;br&gt;&lt;br&gt;まず、[BranchCode]: [Branch Name] の文字列を取得するクエリーに PATH モードの FOR XML 句を指定して、「|||」 で区切られたの文字列を生成しています。&lt;br&gt;&lt;br&gt;その箇所だけを実行すると、このような結果になります。&lt;br&gt;&lt;br&gt;T-SQL - 文字列に改行を挿入する 7&lt;br&gt;&lt;br&gt;&lt;br&gt;次に STUFF を使って、取得した文字列の先頭の区切り文字を取り除きます。&lt;br&gt;&lt;br&gt;そして、最後に REPLACE を使って 「|||」 を、改行文字 CHAR(13) + CHAR(10) に置き換えることで、間に改行文字を挿入しています&lt;br&gt;&lt;br&gt;&lt;br&gt;区切り文字は何でもいいのですが、値に使われていないものを指定してください。&lt;br&gt;&lt;br&gt;区切り文字を変える時は、以下の緑の部分を変更し、黄色で囲まれた部分に区切り文字の文字数を入れてください。&lt;br&gt;&lt;br&gt;T-SQL - 文字列に改行を挿入する 6&lt;br&gt;&lt;br&gt;&lt;br&gt;改行の代わりにカンマなど他の文字を挿入することも可能です。 その時は CHAR(13) + CHAR(10) の変わりにその文字を指定してください。&lt;br&gt;&lt;br&gt;これは改行の代わりに カンマ＆空白を挿入した例です。&lt;br&gt;&lt;br&gt;T-SQL - 文字列に改行を挿入する 8&lt;br&gt;&lt;br&gt;この方法だと、元々の値にカンマが入っていてもカンマを区切り文字にすることが可能です。&lt;br&gt;&lt;br&gt; 今回はレコードがあまり入っていないテーブルからのデータの取得だったので、ひとつのクエリーで取得しましたが、レコード数の多いテーブルから取得する場合は、一度対象のデータをテンポラリーテーブルに取得してから、結合した文字列を生成するほうがパフォーマンスが良いかもしれません。</description><pubDate>Thu, 03 May 2018 21:00:00 GMT</pubDate><category>便利なT-SQL＆クエリー集</category></item>
<item><title>SQL Server - ジョブの作成とスケジュール設定方法</title><link>https://sql55.com/sql-server/how-to-create-scheduled-jobs.php</link><description>SQL Server - ジョブの作成とスケジュール設定方法&lt;br&gt;&lt;br&gt; &lt;br&gt;SQL Server - ジョブの作成とスケジュール設定方法&lt;br&gt;夜間バッチの処理などで、ストアード・プロシージャー等をスケジュールして実行したい時があると思います。&lt;br&gt;&lt;br&gt;そんな時は SQL Server エージェントにジョブを作成し、スケジュールすることで実行が可能です。&lt;br&gt;&lt;br&gt; SQL Server の Express バージョンには、 SQL Server エージェントは含まれていませんので、他のバージョンをご利用ください。&lt;br&gt;ここでは、SQL Server Management Studio から、簡単なジョブの作成とスケジュールの方法をご紹介します。&lt;br&gt;&lt;br&gt;&lt;br&gt;SQL Server エージェントを開始する&lt;br&gt;まず、ジョブをスケジュールで実行する為には SQL Server エージェント が開始している必要があります。&lt;br&gt;&lt;br&gt;SQL Server - ジョブの作成とスケジュール設定方法 1&lt;br&gt;&lt;br&gt;&lt;br&gt;開始していない場合は次の手順で SQL Server 構成マネージャー から SQL Server エージェントを開始します。&lt;br&gt;&lt;br&gt;まず、Windows のスタートメニューの検索で SQLServerManager&lt;バージョン&gt;.msc と入力して、SQL Server 構成マネージャーを開きます。&lt;br&gt;&lt;br&gt;各 SQL Server に対応するバージョンは以下の通りです。&lt;br&gt;&lt;br&gt;SQL Server 2012 - SQLServerManager11.msc&lt;br&gt;SQL Server 2014 - SQLServerManager12.msc&lt;br&gt;SQL Server 2016 - SQLServerManager13.msc&lt;br&gt;SQL Server 2017 - SQLServerManager14.msc&lt;br&gt;SQL Server - ジョブの作成とスケジュール設定方法 2&lt;br&gt;&lt;br&gt;&lt;br&gt;左側で SQL Server のサービス を選択し、右側で起動したい SQL Server エージェント で右クリックし プロパティ を選択します。&lt;br&gt;&lt;br&gt;SQL Server - ジョブの作成とスケジュール設定方法 3&lt;br&gt;&lt;br&gt;&lt;br&gt;サービス タブをクリックし、開始モード を 自動 にして、[適用] ボタンをクリックします。&lt;br&gt;&lt;br&gt;SQL Server - ジョブの作成とスケジュール設定方法 4&lt;br&gt;&lt;br&gt;ここを自動にする理由は、Windows が再起動したときなどに、SQL Server エージェントのサービスも自動で起動して欲しいからです。&lt;br&gt;&lt;br&gt;&lt;br&gt;次に ログオン タブをクリックし、[開始] ボタンをクリックすると、SQL Server エージェントが開始します。 [OK] ボタンをクリックして画面を閉じます。&lt;br&gt;&lt;br&gt;SQL Server - ジョブの作成とスケジュール設定方法 5&lt;br&gt;&lt;br&gt;&lt;br&gt;SQL Server エージェントが開始しました。&lt;br&gt;&lt;br&gt;SQL Server - ジョブの作成とスケジュール設定方法 6&lt;br&gt;&lt;br&gt;&lt;br&gt;SQL Server エージェントのジョブを作成する&lt;br&gt;それでは、Test データベースにある uspTest というストアードプロシージャを実行するだけのシンプルなジョブを作成して、毎日午前 2 時に実行されるようにスケジュールしてみましょう。&lt;br&gt;&lt;br&gt;SQL Server Management Studio の オブジェクトエクスプローラ で SQL Server エージェント を開き、ジョブ で右クリックして 新しいジョブ をクリックします。&lt;br&gt;&lt;br&gt;SQL Server - ジョブの作成とスケジュール設定方法 7&lt;br&gt;&lt;br&gt;&lt;br&gt;新しいジョブの画面が出てきますので、まず 全般 のページで名前を入力します。 まだ OK ボタンは押さないでください。&lt;br&gt;&lt;br&gt;SQL Server - ジョブの作成とスケジュール設定方法 8&lt;br&gt;&lt;br&gt;&lt;br&gt;次に ステップ のページを選択し、新規作成 をクリックします。&lt;br&gt;&lt;br&gt;SQL Server - ジョブの作成とスケジュール設定方法 9&lt;br&gt;&lt;br&gt;&lt;br&gt;新しいジョブステップ の画面が出てきますので、ステップ名に適当な名前を入力し、データベース は Test を選択し、コマンド に EXEC uspTest; と入力し、[OK] ボタンをクリックします。&lt;br&gt;&lt;br&gt;SQL Server - ジョブの作成とスケジュール設定方法 10&lt;br&gt;&lt;br&gt;SQL Server - ジョブの作成とスケジュール設定方法 11&lt;br&gt;&lt;br&gt;&lt;br&gt;次に、スケジュール のページを選択し、新規作成 をクリックします。&lt;br&gt;&lt;br&gt;SQL Server - ジョブの作成とスケジュール設定方法 12&lt;br&gt;&lt;br&gt;&lt;br&gt;新しいジョブスケジュール の画面が出てきますので、名前に適当な名前を入力し、頻度 の 実行に 毎日 を選択し、一日のうちの頻度 は 一回 を選択して、時間を 2:00:00 AM に設定し、[OK] ボタンをクリックします。&lt;br&gt;&lt;br&gt;SQL Server - ジョブの作成とスケジュール設定方法 13&lt;br&gt;&lt;br&gt;&lt;br&gt;今回は通知等は設定しないので、ここで OK ボタンをクリックするとジョブが作成されます。&lt;br&gt;&lt;br&gt;SQL Server - ジョブの作成とスケジュール設定方法 14&lt;br&gt;&lt;br&gt;&lt;br&gt;SQL Server Management Studio のオブジェクトエクスプローラーに戻ると、SQL Server エージェントのところに TestJob1 ができていますね。&lt;br&gt;&lt;br&gt;SQL Server - ジョブの作成とスケジュール設定方法 15&lt;br&gt;&lt;br&gt;これで、毎日午前 2 時に実行されるようにスケジュールされた、Test データベースにある uspTest というストアードプロシージャを実行するジョブが生成されました。</description><pubDate>Thu, 26 Apr 2018 21:16:00 GMT</pubDate><category>Microsoft SQL Server 入門</category></item>
<item><title>T-SQL - WHILE の使い方</title><link>https://sql55.com/t-sql/t-sql-while.php</link><description>T-SQL の WHILE の使い方&lt;br&gt;今回は T-SQL でループしたい時に便利な WHILE の使い方を見てみましょう。&lt;br&gt;&lt;br&gt;&lt;br&gt;WHILE&lt;br&gt;WHILE を使うと、指定した条件文が TRUE を返す間、ステートメントやステートメントブロックを繰り返すことができます。&lt;br&gt;&lt;br&gt;途中でループを抜けたい時には BREAK を使って抜けることができます。&lt;br&gt;&lt;br&gt;途中で続きのステートメントを実行せず WHILE の条件チェックに戻りたい時には CONTINUE を使います。&lt;br&gt;&lt;br&gt;&lt;br&gt;構文は次の通りです。&lt;br&gt;&lt;br&gt;WHILE [ 条件文 ]&lt;br&gt;BEGIN&lt;br&gt;&lt;br&gt;   [ 繰り返したいステートメントブロック / BREAK / CONTINUE ]&lt;br&gt;&lt;br&gt;END&lt;br&gt;条件のチェックは最初に行われるので、条件が最初から FALSE になる時は一度も実行されません。&lt;br&gt;&lt;br&gt;繰り返したいものがステートメントひとつだけの場合は BEGIN END はなくても大丈夫なのですが、わかりやすいので私は常に書くようにしています。&lt;br&gt;&lt;br&gt;&lt;br&gt;それでは、WHILE を実際に使ってみましょう。&lt;br&gt;&lt;br&gt;WHILE を使って、2020-01-01 から 2020-01-15 の日付のうち、土日以外の日を Print するクエリーは次の通りです。&lt;br&gt;&lt;br&gt;SET DATEFIRST 1; -- 月曜日を１とする&lt;br&gt;&lt;br&gt;DECLARE @StartDate DATE = &#039;2020-01-01&#039;,&lt;br&gt;	@EndDate   DATE = &#039;2020-01-15&#039;;&lt;br&gt;&lt;br&gt;WHILE @StartDate &lt;= @EndDate&lt;br&gt;BEGIN&lt;br&gt;&lt;br&gt;	IF DATEPART(DW, @StartDate) IN (6,7) -- 土・日&lt;br&gt;	BEGIN&lt;br&gt;	   SET @StartDate = DATEADD(dd, 1, @StartDate);&lt;br&gt;	   CONTINUE;&lt;br&gt;	END&lt;br&gt;&lt;br&gt;	PRINT @StartDate;	&lt;br&gt;&lt;br&gt;	SET @StartDate = DATEADD(dd, 1, @StartDate);&lt;br&gt;&lt;br&gt;END&lt;br&gt;T-SQL - WHILE の使い方 1&lt;br&gt;&lt;br&gt;WHILE の条件文の @StartDate &lt;= @EndDate が TRUE を返す間、BEGIN から END で囲まれた部分が繰り返されます。&lt;br&gt;&lt;br&gt;SET @StartDate = DATEADD(dd, 1, @StartDate); で @StartDate に 1 日ずつ追加してループしています。&lt;br&gt;&lt;br&gt;SET DATEFIRST 1 は私の環境が DEFAULT で DATEFIRST 7 なので、DATEPART の dw の結果が月曜日が 1 になるように設定しています。&lt;br&gt;&lt;br&gt;CONTINUE の前でも日付を追加しないと無限ループになるのでご注意くださいね！</description><pubDate>Sat, 07 Apr 2018 08:40:00 GMT</pubDate><category>T-SQL 入門</category></item>
</channel>
</rss>
