SQL Server
★型
整数: bigint int smallint tinyint bit
小数: decimal float
金額: money smallmoney
日付・時間: datetime smalldatetime date time datetime2 datetimeoffset
文字列: varchar nvarchar char nchar
text ntext ⇒ varchar(max) nvarchar(max)
二進数: varbinary binary
image ⇒ varbinary(max)
特殊: sql_variant timestamp uniqueidentifier xml
大 > 小
bigint > int > smallint > tinyint > bit varchar(20) > varchar(10) datetime > smalldatetime
可変 > 固定
float > decimal varchar > char nvarchar > nchar varbinary > binary
char 長さが固定 例:電話番号、郵便番号 効率よい LTRIMとRTRIMを忘れず
varchar 長さが可変 例:名前、地名
char/varchar 英数字 非Unicode 範囲:1~8000 byte単位で保存
nchar/nvarchar 多国言語 Unicode 範囲:1~4000 char単位で保存
char(10) 内容:abc 消費:10 byte 最大10 byte
varchar(10) 内容:abc 消費:3 byte 最大10 byte
nvarchar(10) 内容:abcあ 消費:4x2=8 byte 最大10 char(20 byte)
★ロック
SELECT * FROM table WITH(<lock>)
UPDATE table WITH(<lock>) SET col = 'xxx'
NOLOCK ロックが影響なし
HOLDLOCK
XLOCK 排他
UPDLOCK 更新
※UPDATE, DELETE, INSERTではNOLOCKが使えない
★多量のデータをINSERTする場合
データファイル(固定長)
20120101320.35260XXX
20120102179.81350YYY
データファイル(区切り)
20120101,320.35,260,XXX
20120102,179.81,350,YYY
フォーマットファイル
<?xml version="1.0"?>
<BCPFORMAT
xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<RECORD>
<FIELD ID="1" xsi:type="CharFixed" LENGTH="8"/> 固定長
<FIELD ID="2" xsi:type="CharFixed" LENGTH="6"/>
<FIELD ID="3" xsi:type="CharFixed" LENGTH="3"/>
<FIELD ID="4" xsi:type="CharTerm" TERMINATOR="\r\n"/>
<FIELD ID="1" xsi:type="CharTerm" TERMINATOR=","/> 区切り
<FIELD ID="2" xsi:type="CharTerm" TERMINATOR=","/>
<FIELD ID="3" xsi:type="CharTerm" TERMINATOR=","/>
<FIELD ID="4" xsi:type="CharTerm" TERMINATOR="\r\n"/>
</RECORD>
<ROW>
<COLUMN SOURCE="1" NAME="Date" xsi:type="SQLDATE"/>
<COLUMN SOURCE="2" NAME="Price" xsi:type="SQLDECIMAL" PRECISION="5" SCALE="2"/>
<COLUMN SOURCE="3" NAME="Quantity" xsi:type="SQLINT"/>
</ROW>
</BCPFORMAT>
書き方1
BULK INSERT table
FROM 'C:\data.txt'
WITH(
FORMATFILE='C:\format.xml',
FIELDTERMINATOR=',',
ROWTERMINATOR='\r\n');
書き方2
INSERT INTO table
SELECT *
FROM OPENROWSET
(
BULK 'C:\data.txt',
FORMATFILE='C:\format.xml',
FIRSTROW='3' --3行目から
) AS tbl;
★システムテーブル
すべてのDB
SELECT name FROM SysDatabASes ORDER BY name
指定したテーブルのカラム名
SELECT name FROM SysColumns WHERE id = Object_Id(<table>)
DBにあるすべてのテーブル
SELECT name FROM SysObjects WHERE xtype = 'U' ORDER BY name
xtypeの種類
C = CHECK 制約
D = DEFAULT 制約
F = FOREIGN KEY 制約
L = ログ
FN = スカラ関数
IF = インライン テーブル関数
P = ストアド プロシージャ
PK = PRIMARY KEY 制約 (タイプ K)
RF = レプリケーション フィルタ ストアド プロシージャ
S = システム テーブル
TF = テーブル関数
TR = トリガ
U = ユーザー テーブル
UQ = UNIQUE 制約 (タイプ K)
V = ビュー
X = 拡張ストアド プロシージャ
★システム関数・変数
SELECT app_name();
SELECT current_timestamp; --現在時間
SELECT current_user;
SELECT host_id();
SELECT host_name();
SELECT db_name();
SELECT @@rowcount; --影響行数
SELECT @@error; --T-SQLのエラー番号
SELECT @@procid;
SELECT @@langId; --言語ID
SELECT @@language; --言語名称
SELECT @@max_connections; --最大接続数
SELECT @@connections; --接続数
SELECT @@servername; --ローカル
SELECT @@servicename;
SELECT @@version;
★主キーの作成方法
方法1
CREATE TABLE table(
id INT IDENTITY(1,2) NOT NULL PRIMARY KEY,
number VARCHAR(20) UNIQUE NOT NULL,
name VARCHAR(20) NOT NULL,
password VARCHAR(20) DEFAULT(123),
description VARCHAR(40) NULL
)
INSERT INTO table(number,name,description) VALUES('001','Andy','あああ')
INSERT INTO table(number,name,description) VALUES('002','Tom','いいい')
方法2
CREATE TABLE table(
id UNIQUEIDENTIFIER NOT NULL PRIMARY KEY,
number VARCHAR(20) UNIQUE NOT NULL,
name VARCHAR(20) NOT NULL,
password VARCHAR(20) DEFAULT(123),
description VARCHAR(40) NULL
)
INSERT INTO table(id,number,name,description) VALUES(NEWID(),'001','Andy','あああ')
INSERT INTO table(id,number,name,description) VALUES(NEWID(),'002','Tom','いいい')
★複数行を一行にする
SELECT
table.Category
,(
SELECT
CAST(T.Value AS VARCHAR) + ','
FROM table AS T
WHERE T.Category = table.Category
FOR XML PATH('')
) AS Values
FROM table
GROUP BY Category
★挿入・更新を同時に対応
MERGE INTO table1
USING table2 --或いは USING (SELECT '001' id, 'Andy' name) table2
ON table1.id = table2.id
WHEN MATCHED THEN
UPDATE SET table1.name = table2.name
WHEN NOT MATCHED THEN
INSERT (table1.id, table1.name) VALUES ( table2.id, table2.name );