====== SQL Server ======
====== Main ======
===== ストアドのサンプル =====
CREATE procedure sp_sample @MngID int as
--変数リストの宣言
DECLARE @FirstName nvarchar(50)
DECLARE @LastName nvarchar(50)
DECLARE @Title nvarchar(50)
--カーソルの宣言
--この時点では箱ができるだけ
DECLARE EmpCur cursor FOR
SELECT cnt.FirstName
,cnt.LastName
,emp.Title
FROM HumanResources.Employee as emp
INNER JOIN Person.Contact AS cnt
ON emp.ContactID = cnt.ContactID
WHERE emp.ManagerID = @MngID
--カーソルを開く
--箱を使えるようにする
OPEN EmpCur
--FETCH(行の取り出し)
FETCH NEXT FROM EmpCur INTO @FirstName,@LastName,@Title
--LOOP
--fecth(行の取出し)が正常に行えている間
WHILE (@@fetch_status = 0)
BEGIN
--変数リストの値を出力
PRINT @FirstName + ' ' + @LastName + ' ' + @Title
--FETCH(行の取り出し)
FETCH NEXT FROM EmpCur INTO @FirstName,@LastName,@Title
end
--カーソルを閉じる
CLOSE EmpCur
DEALLOCATE EmpCur
RETURN VALUE
===== ストアドの編集 =====
―Microsoft SQL Server Management Studio
―データベース
―対象DB
―プログラミング
―ストアドプロシージャ
===== 複数クエリを一括実行 =====
BEGIN TRAN
update テーブル set カラム1 = 値1 WHERE 検索条件1
update テーブル set カラム1 = 値2 WHERE 検索条件2
update テーブル set カラム1 = 値3 WHERE 検索条件3
COMMIT
===== 特定テーブルのカラム情報取得 =====
DECLARE @ObjectName Varchar(50);
SET @ObjectName = 'テーブル名';
SELECT
sys.columns.column_id,
sys.columns.name as Column_Name,
sys.types.name as Type,
sys.columns.max_length,
(CASE sys.columns.is_nullable
WHEN 0 THEN 'NO'
WHEN 1 THEN 'YES'
ELSE 'nothing'
END) as IsNULL
FROM
sys.objects,
sys.types,
sys.columns
WHERE
sys.objects.name like @ObjectName
AND sys.objects.object_id = sys.columns.object_id
AND sys.types.system_type_id = sys.columns.system_type_id
-- AND 絞り込み条件
ORDER BY
sys.columns.column_idORDER BY sys.columns.column_id
または、
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'テーブル名'
===== ランダムSELECT =====
NEWID() は実行のたびにランダムに抽出される。
SELECT TOP n * FROM Table ORDER BY NEWID()
RAND() は一度の実行ではランダムに抽出されるが、2度目以降は同じものが返ってくる。
SELECT TOP n * FROM Table ORDER BY RAND()
===== グループ毎の先頭(最後)n件だけ取り出す =====
SELECT
Feild_1
,Feild_2
,Feild_3
,Feild_X
FROM
(
SELECT
*
,ROW_NUMBER() OVER (PARTITION BY Feild_1 ORDER BY NEWID()) as Feild_X
-- Feild_1 でグループ化して、NEWID()でランダムに一意の値を設定
FROM
Table
WHERE
抽出条件
) A
WHERE
A.Feild_X <= 3 -- 各グループのTOP3件を抽出
ORDER BY
A.Feild_X
===== (SQL Server)インデックス関連 =====
==== 状態取得 ====
avg_fragmentation_in_percentの値が断片化率(%)。
断片化率が100に近いほど、断片化が発生していることになる。
SELECT DB_NAME(database_id) as db_name
,OBJECT_NAME(object_id) as table_name
,(select min(name) from sys.indexes
where sys.indexes.object_id = sys.dm_db_index_physical_stats.object_id
and sys.indexes.index_id = sys.dm_db_index_physical_stats.index_id)as index_name
,index_type_desc
,avg_fragmentation_in_percent --断片化の割合
,fragment_count --インデックス内の断片化の数
,avg_fragment_size_in_pages --インデックス内の1つ断片化内の平均ページ数
FROM sys.dm_db_index_physical_stats
(DB_ID(),NULL, NULL, NULL , 'LIMITED')
order by avg_fragmentation_in_percent desc;
==== インデックスの再構成(REORGANIZE) ====
既に割り当てられている領域を利用して断片化の解消を行う
ALTER INDEX インデックス名 ON テーブル名 REORGANIZE
==== インデックスの再構築(REBUILD) ====
新規のページを使用して断片化の解消が行う(再構成より効果大)
ALTER INDEX インデックス名 ON テーブル名 REBUILD
ALTER INDEX ALL ON テーブル名 REBUILD