alacarte:sql_server
目次
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
alacarte/sql_server.txt · 最終更新: 2025/02/16 13:53 by 127.0.0.1
