【SQL Server】テーブルに新規に列を追加、削除する方法

すでに作成されているテーブルに対して新規に列を追加する方法です。

列を追加したい場合はALTER TABLEを使用して列をテーブルに追加します。

テーブルに列を新規で追加する場合

(1)構文

ALTER TABLE <対象テーブル名> ADD <追加したい列の列名> <データ型>;

ALTER TABLEの後ろに列を追加したい対象となるテーブル名を設定し、ADD句の後ろに追加したい列の列名と追加する列のデータ型を設定します。



(2)使用例
①「性別ID」列追加前の従業員テーブル(T_EMPLOYEE)

今回は従業員の情報を取り扱っているT_EMPLOYEEテーブルに新しく「性別ID」列(SEX_ID)を追加します。
f:id:rumr-Labo:20190604020639p:plain



②「性別ID」列追加SQL

--「性別ID」列追加SQL
ALTER TABLE T_EMPLOYEE ADD SEX_ID NVARCHAR(1);

「性別ID」列を追加するためのALTER TABLEのSQLです。



③「性別ID」列追加後の従業員テーブル(T_EMPLOYEE)

f:id:rumr-Labo:20190604021135p:plain

列を追加が完了するとテーブルの1番後ろに追加した「性別ID」列が追加されます。
単純に列を追加しただけであるため、各レコード内の「性別ID」列の中はNullの状態になっています。


列追加時に制約を付与する

前項のALTER TABLEのSQLでは「性別ID」列を追加することができましたが、追加したときに列内の値がすべてNullで追加されてしまいます。
Nullではなく初期値を設定したいという場合にはテーブル作成時にも使用するDEFAULTとNOT NULLを使用して初期値を設定します。
(1)構文

ALTER TABLE <対象テーブル名> ADD <追加したい列の列名> <データ型> DEFAULT <初期値> NOT NULL;


前項で紹介したALTER TABLEのSQL文にDEFAULTとNOT NULLを付けたしました。
列追加時にこのように設定することで列内にNullが入ることを防ぐことができます。



(2)使用例

--「性別ID」列追加SQL
ALTER TABLE T_EMPLOYEE ADD SEX_ID NVARCHAR(1) DEFAULT '1' NOT NULL;

①「性別ID」列追加前の従業員テーブル(T_EMPLOYEE)


f:id:rumr-Labo:20190604020639p:plain



②「性別ID」列追加後の従業員テーブル(T_EMPLOYEE)


f:id:rumr-Labo:20190604031115p:plain


画像の通り、性別ID列の値はすべて列追加時に値「1」が入るようになります。
注意としてはALTER TABLEのSQL作成時にNOT NULLを設定しておかないと列追加時に値が「1」ではなく、Nullが入ってしまうということです。
これはDEFAULTはあくまでも列登録時に適応される制約であるためだと思われます。

そのため、列を新規に追加するという場合に初期値を決めておきたいという場合にはDEFAULTとNOT NULLを定義しておく必要があります。



③NOT NULLを定義せず、DEFAULTのみを定義して列を追加した場合


f:id:rumr-Labo:20190604032204p:plain


テーブルから指定の列を削除する場合

テーブルから指定の列を削除したいという場合にもALTER TABLEを使用して列を削除します。

(1)構文

ALTER TABLE <対象テーブル名> DROP COLUMN <削除したい列の列名>;


列追加時と同じくALTER TABLEを先頭に書き、後ろに対象とするテーブル名を書きます。
その後ろでDROP COLUMNと書き、削除したい列の列名を設定します。


(2)使用例


①「性別ID」列削除前の従業員テーブル(T_EMPLOYEE)


従業員の情報を取り扱っているT_EMPLOYEEテーブルから「性別ID」列(SEX_ID)を削除します。

f:id:rumr-Labo:20190604031115p:plain


②「性別ID」削除SQL

--「性別ID」列削除SQL
ALTER TABLE T_EMPLOYEE DROP COLUMN SEX_ID;


③実行結果


f:id:rumr-Labo:20190604040246p:plain

削除する対象列に制約設定が存在しない場合(PRIMARY KEY制約やNOT NULL制約等)は上記のSQL文で列の削除が可能です。
しかし、対象列に制約が設定されている場合SQL実行時に実行エラーが出ます。


f:id:rumr-Labo:20190604034101p:plain


詳しくはわかりませんが、削除対象となる列がオブジェクトの参照先となっており、依存関係?にあることで削除ができないようです。
そのため、このままでは列の削除ができません。(一応テーブルを丸ごと削除し、テーブル再作成時に削除したい列を削除しておけばできなくはないですが、お勧めできないです。)
問題を解決するためには削除を実行できるように対象列の依存関係を削除します。要は対象列を参照しているオブジェクト(おそらくは制約そのもの)を解除してあげることです。


オブジェクトの削除

(1)構文

ALTER TABLE <対象テーブル名> DROP CONSTRAINT<削除したいオブジェクト名>;


上記の構文でオブジェクトの削除を行います。構文内の「削除したいオブジェクト名」は列削除の実行エラー時に表示されていたオブジェクト のことです。(今回の実行エラーではDF__T_EMPLOYE__SEX_I__282DF8C2)

(2)実際の使用例


①オブジェクトを解除するALTER TABLE

--「性別ID」列制約削除SQL
ALTER TABLE T_EMPLOYEE DROP CONSTRAINT DF__T_EMPLOYE__SEX_I__282DF8C2;


上記のSQLを使用して制約の解除を行います。


②実行結果


f:id:rumr-Labo:20190604035835p:plain


実行後、先ほど実行エラーで使用できなかった列削除用のSQL文を実行します。


f:id:rumr-Labo:20190604040101p:plain



③「性別ID」列削除後の従業員テーブル(T_EMPLOYEE)


f:id:rumr-Labo:20190604040246p:plain

【SQLServer】マスタテーブルから取得した項目をメインのテーブルで使用する方法

今日はマスタテーブルに存在するレコードを取得し、取得した情報をメインのテーブルで使用する方法を書いていきます。

1.使用するテーブル

・メインテーブル(社員テーブル)
メインとして取り扱うテーブルは社員のIDと役職ID、社員の名前を取り扱う社員テーブル(T_EMPLOYEE)です。

テーブルの内容
f:id:rumr-Labo:20190523004402p:plain

テーブルの中には社員のレコードが4レコードがすでに登録されています。
EMPLOYEE_ID列には社員ID、POSITION_ID列には役職ID、NAME列には社員の名前がそれぞれ登録されています。

・サブテーブル(役職マスタテーブル)
次にサブとして使用するテーブルです。このテーブルは役職名を保持しておくマスタテーブルです。(M_POSITION)
役職IDテーブル内には役職情報が4レコードすでに登録されています。

テーブルの内容
f:id:rumr-Labo:20190523001625p:plain

今回は役職マスタテーブルからこの役職情報を取得し、メインの社員テーブルで使用できるようにします。

2.役職情報を含んだ社員情報を取得する

役職情報を含む社員の情報を取得したい場合は社員テーブルと役職テーブルを結合します。

(1)社員テーブルと役職マスタテーブルを結合する

社員テーブルと役職マスタテーブルを結合するためにはINNER JOINを使用してテーブルを結合します。
テーブルの結合条件は2つのテーブルで共通して持っている列を結合条件とする必要があります。

今回、2つのテーブルで役職IDを取り扱っており、この列を結合条件としてテーブルを結合します。

・実際のSQL

--SELECT文
--役職マスタテーブルと役職IDを条件にテーブル結合を行い、レコードを取得した場合
SELECT TE.EMPLOYEE_ID
,TE.POSITION_ID
,TE.NAME 
,MP.ID
,MP.POSITION
FROM T_EMPLOYEE AS TE
INNER JOIN M_POSITION AS MP
ON TE.POSITION_ID = MP.ID

実際のSQLでは上記のようにSQLを書きます。
メインテーブルの社員テーブルのPOSITION_ID列とサブテーブルの役職マスタテーブルのID列をON句で結合することでテーブルの結合が可能となります。

出力結果
f:id:rumr-Labo:20190523004550p:plain

出力結果は画像の通りになります。
役職IDに一致する役職名がそれぞれのレコードで取得することができました。
INNER JOIN句は2つ以上使用することも可能であるため、取り扱いたいマスタテーブルが増えても同じように記述していけば特に問題はありません。

(2)不要な列を削除する

前項で社員テーブルと役職マスタテーブルの結合が完了しました。
一応前項で社員情報の取得は完了していますが、この項では不要な列を削除していきます。

出力結果を見てわかる通り、結合条件で使用した役職ID列が不要な列であるため、役職ID列を削除します。
列の削除に加え、列の並び順も少し変更を加えます。

--SELECT文
--役職マスタテーブルと役職IDを条件にテーブル結合を行い、レコードを取得した場合
SELECT TE.EMPLOYEE_ID
,MP.POSITION
,TE.NAME 
FROM T_EMPLOYEE AS TE
INNER JOIN M_POSITION AS MP
ON TE.POSITION_ID = MP.ID

出力結果
f:id:rumr-Labo:20190523005815p:plain

役職ID列を取り除き、出力結果がすっきりしました。

3.まとめ

今回はマスタ情報を取り扱うマスタテーブルから情報を取り出し、その情報をメインテーブルで使用できるようにすることを行いました。
この方法を使用することでデータを確実に取得することができ、無駄な処理をプログラム側で書く必要性が減少します。
また、データベースのメンテナンスをするときにも最小限の修正で済ますことができるためおすすめです。

使用したテーブルを構成するSQL

社員テーブル(T_EMPLOYEE)

テーブル作成用SQL

--社員テーブル テーブル作成用SQL
CREATE TABLE T_EMPLOYEE
(
EMPLOYEE_ID NVARCHAR(5) NOT NULL,
POSITION_ID NVARCHAR(3) NOT NULL,
NAME NVARCHAR(50) NOT NULL,
PRIMARY KEY(EMPLOYEE_ID,POSITION_ID)
);

レコード追加用SQL

--INSERT文
INSERT INTO T_EMPLOYEE(EMPLOYEE_ID,POSITION_ID,NAME)VALUES('00001','004','テスト太郎');
INSERT INTO T_EMPLOYEE(EMPLOYEE_ID,POSITION_ID,NAME)VALUES('00002','003','テスト次郎');
INSERT INTO T_EMPLOYEE(EMPLOYEE_ID,POSITION_ID,NAME)VALUES('00003','002','テスト花子');
INSERT INTO T_EMPLOYEE(EMPLOYEE_ID,POSITION_ID,NAME)VALUES('00004','001','テスト三郎');

役職テーブル(M_POSITION)

テーブル作成用SQL

--役職マスタテーブル テーブル作成用SQL
CREATE TABLE M_POSITION
(ID NVARCHAR(3) PRIMARY KEY NOT NULL,
POSITION NVARCHAR(50) NOT NULL,
);

レコード追加用SQL

--INSERT文
INSERT INTO M_POSITION(ID,POSITION)VALUES('001','一般社員');
INSERT INTO M_POSITION(ID,POSITION)VALUES('002','主任');
INSERT INTO M_POSITION(ID,POSITION)VALUES('003','係長');
INSERT INTO M_POSITION(ID,POSITION)VALUES('004','課長');

実行環境

OS:Windows10
SQLServer Management Studio v17.4

【SQLServer】テーブル作成時、テーブルの列にプライマリーキー制約を付与する方法

今回はテーブル作成時にテーブルの列にプライマリーキー制約を付与する方法を載せます。

1.1つの列にプライマリーキー制約を付与する場合
2.複数の列にプライマリーキーを付与する場合

1.1つの列にプライマリーキー制約を付与する場合

1つの列に対してプライマリーキー制約を付与する場合はテーブル作成時にその列で以下の内容を書きます。

・構文

CREATE TABLE TABLE
(
<列名><データ型> PRIMARY KEY ←プライマリーキーにしたい列
,<列名>
・
・
・

)

・使用例

--1つの列にプライマリーキーを付与するSQL
CREATE TABLE TABLE_1
(
ID NVARCHAR(4) PRIMARY KEY,
NAME NVARCHAR(50),
UPDT_YMDT DATE
);

使用例は「TABLE_1」という名前のテーブルを作成するときにの例です。
テーブル構成はID、名前、更新日列の3列で構成しています。

今回はID列にプライマリーキー制約を付与するので、ID列にPRIMARY KEYを書いています。
このようにプライマリーキー制約を1つの列に付与したいという場合にはその列の横にPRIMARY KEYと書きます。
ただし、この書き方では1つの列に対してでしかプライマリーキー制約を付与することができないため、複数列に制約を付与したいという場合には
向かない書き方です。
(2つの列に同じような書き方をした場合は構文エラーとなり、テーブルは作成できません。)

f:id:rumr-Labo:20190522210133p:plain

2.列(複数)にプライマリーキーを付与する場合

前項のように複数の列に対してプライマリー制約をしたいという場合には以下のようにSQLを書きます。

・構文

CREATE TABLE TABLE
(
<列名1><データ型> ←プライマリーキーにしたい列
,<列名2><データ型>←プライマリーキーにしたい列
・
・
・
,PRIMARY KEY(<列名1>,<列名2>)
)

・使用例
使用例は「TABLE_3」という名前のテーブルを作成するときにの例です。
テーブル構成はID、ID2、名前、更新日列の4列で構成しています。
ID_1とID_2列に今回はプライマリー制約をつけたいため、以下のように書きます。

--複数の列にプライマリーキーを付与するSQL
CREATE TABLE TABLE_3
(
ID_1 NVARCHAR(4),
ID_2 NVARCHAR(4),
NAME NVARCHAR(50),
UPDT_YMDT DATE,
PRIMARY KEY(ID_1,ID_2)
);

複数の列を指定する場合は列の最後にPRIMARY KEY()と書き、括弧の中にプライマリー制約を付けたい列名を書きます。

実行環境

OS:Windows10
SQL Server Management Studio v17.4

【C#】クラスライブラリ(dllファイル)の取り扱い

ひさしぶりの更新です。
今日はクラスライブラリ(dllファイル)の作成方法と実際の取り扱いまでを記事にしました。

1.クラスライブラリの作成
2.クラスライブラリの参照設定
3.クラスライブラリの呼び出し



1.クラスライブラリの作成

①VisualStudioを起動し、新しいプロジェクトを選択。
②VisualC#の項目からクラスライブラリを選択する。
③プロジェクト名、保存場所を設定し、OKボタンをクリックする。

f:id:rumr-Labo:20190521033448p:plain


④プロジェクト内にClass1.csというファイルが存在するので、ファイル内にクラスライブラリ用の関数を書き込む。

f:id:rumr-Labo:20190521034143p:plain

⑤メニュー>ビルド>ソリューションのビルドを選択し、ビルドを行う。

ビルド時に特に問題が発生しなければクラスライブラリの作成は成功。
作成したクラスライブラリはプロジェクトのフォルダ→<プロジェクト名>→bin→Debugの中に保存されている。

f:id:rumr-Labo:20190521034657p:plain



2.クラスライブラリの参照設定

①クラスライブラリを使用するため、使用するための専用プロジェクトを別に作成する。
②プロジェクト下に存在する参照の項目を右クリックし、参照の追加を選択する。
③参照マネージャーのダイアログが表示されるので、下のほうに存在する参照ボタンをクリックする。

f:id:rumr-Labo:20190521035035p:plain


④ボタンクリック後、ファイル選択画面が表示されるので、前項で作成したクラスライブラリ(.dllの拡張子がついているファイル)が保存されている場所を開き、対象のファイルを選択する。

f:id:rumr-Labo:20190521035433p:plain


⑤クラスライブラリ追加後、参照マネージャーのダイアログに先ほど選択したクラスライブラリファイルが表示されていることを確認し、OKボタンをクリックする。

f:id:rumr-Labo:20190521035553p:plain


⑥ボタンクリック後、プロジェクトの参照下に先ほど選択したクラスライブラリが表示される。
表示されていえば、クラスライブラリの参照が可能になる。

f:id:rumr-Labo:20190521035858p:plain



3.クラスライブラリの呼び出し

参照設定完了後、クラスライブラリを実際に呼び出すための処理をソースファイルに書きこむ。
①クラスライブラリのクラスオブジェクトを作成する。

f:id:rumr-Labo:20190521040246p:plain


②作成したクラスオブジェクトから対象のメソッドを呼び出す。

f:id:rumr-Labo:20190521040409p:plain


③ソース書き込み後、プロジェクトを実行する。

f:id:rumr-Labo:20190521040504p:plain

メソッドが正常に呼び出されれば成功。

【HTML、ASP.NET、JavaScript】ボタンクリック時JavaScriptの関数を呼び出す方法

JavaScript関数を呼び出す方法

ボタンクリック時にJavaScriptで定義した関数を呼び出す場合はOnClientClickイベントを使用します。

構文
<asp:Button ID="<ボタンID>" runat="server" Text="<ボタン表記>" OnClientClick="<呼び出したいJavaScript関数名>();"/>

ダブルクォーテーション内に呼び出したいJavaScript関数名を設定します。設定する際にセミコロンをつけ忘れないように注意。
記載が間違っている場合関数未定義エラーや読み込み時にエラーになります。

◆使用例

呼び出したいJavaScript関数
    <script type="text/javascript">
        //動作確認用関数
        function DispAlert() {
            alert('ボタンがクリックされました。')
        }

    </script>

今回は上記のJavaScript関数を呼び出します。
上記の関数は呼び出されることによりボタンがクリックされたことを知らせるメッセージボックスを表示する単純な関数です。
htmlのソースに記載する場合にはheadタグ内に上記のソースコードを記載してください。

JavaScriptを呼び出すhtmlソースコード
<body>
    <form id="form1" runat="server">
        <%--ボタン--%>
        <asp:Button ID="BtnDispData" runat="server" Text="表示" style="position:absolute;" OnClientClick="DispAlert();"/>
    </form>
</body>
ボタンクリック前

f:id:rumr-Labo:20190222221609p:plain

ボタンクリック後

f:id:rumr-Labo:20190222221624p:plain

◆ボタンクリックイベントとJavaScript関数の呼び出しの順番

JavaScript関数を呼び出す際にボタンクリックイベントも発生させるようにしたいという場合について補足。
ボタンクリック時にはJavaScript関数→ボタンクリックイベントの順序でイベントが呼び出されます。
基本ボタンを押したときに2つとも使用するということはあまりないと思いますが、一応記載しておきます。

◆動作環境

・使用OS:Windows10 Home
IE Version:11.590.17134.0
・VisualStudio Community 2017

【HTML、ASP.NET、JavaScript】外部ファイルとして作成したJavaScriptファイルを参照する方法

◆この記事で紹介している内容の概要

・外部ファイルとして作成したJavaScriptファイルをHTML上のコードから参照する方法
(ASP.NETで使用する場合のHTMLのコードも記載)
・Scriptタグの構文と実際の使用例

◆この記事で紹介ししていない内容

・外部ファイルとして作成したJavaScript以外のファイルをHTML上のコードから参照する方法





外部ファイルとして作成をしたJavaScriptファイルを参照したい場合はScriptタグを用いて参照を行います。

構文
<script src="<参照先に設定するファイルのファイルパス>" type="text/javascript"></script>

実際に使用する場合はScriptタグをheadタグ内に記載して使用します。

使用例
<head>
    <script src="../JavaScript/JavaScript.js" type="text/javascript"></script>
</head>
ASP.NETでの使用例
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>単体動作確認</title>
    <%--JavaScript参照設定--%>
    <script src="../JavaScript/JavaScript.js" type="text/javascript"></script>
</head>
ファイル参照がうまくいかない場合

まれに作成したJavaScriptファイルがうまく読み込めず、関数を実際に呼び出した時に"●●は定義されていません"と表示されることがあります。
基本的に考えられる間違いとしては

・参照先のファイル名およびパスが間違って記載されている。
・Scriptタグの設定内容または設定箇所に誤りがある。

上記の2つが考えられます。
ただ、上記の2つの点に問題が無い場合でもJavaScriptをうまく参照できない時があるので、それに関してはわかりません。

動作環境

・使用OS:Windows10 Home
IE Version:11.590.17134.0
・VisualStudio Community 2017

【HTML、ASP.NET】外部のCSSファイルを参照する方法

◆この記事で紹介している内容の概要

・外部ファイルとして作成したCSSファイルをHTML上のコードから参照する方法
(ASP.NETで使用する場合のHTMLのコードも記載)
・linkタグの構文と実際の使用例

◆この記事で紹介ししていない内容

・外部ファイルとして作成したCSS以外のファイルをHTML上のコードから参照する方法


外部ファイルとして作成したCSSファイルの参照はLinkタグを用いることで可能です。

構文
<link href="<参照先のCSSファイルパス>" rel="stylesheet" type="text/css"/>

参照する場合、Headタグ内にlinkタグを定義する。

通常のHTMLソースコードでの使用例
<head>
    <%--CSSファイル参照設定--%>
    <link href="../StyleSheet/StyleSheet.css" rel="stylesheet" type="text/css" />
</head>

使用例では"StyleSheetフォルダ"内のStyleSheet.cssを参照するファイルとして設定しています。

参照先のCSSファイルとフォルダ構成

f:id:rumr-Labo:20190219061421p:plain
参照先に指定するファイルとフォルダ構成

ASP.NETで画面を作成しているときに参照方法が分からなかったので、調べて得られたものを記載しておきます。
一応、ASP.NETで実際に使っているコードも記載しておきます。

ASP.NETでの使用例
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>単体動作確認</title>
    <%--CSSファイル参照設定--%>
    <link href="../StyleSheet/StyleSheet.css" rel="stylesheet" type="text/css" />
</head>
<body>

動作環境

・使用OS:Windows10 Home
IE Version:11.590.17134.0
・VisualStudio Community 2017