====== 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