すぐに忘れるSQLServerのクエリ

# create database

照合順序を指定する。

```
CREATE DATABASE create_database_name collate  Japanese_CS_AS_KS_WS
```

# SQLServerでSELECTした結果をCREATE TABLEする
```
SELECT * INTO CRATE_TABLE FROM SELECT_table
```

# UPDATE,DELETEでjoin

UPDATE

```
UPDATE a 
    SET a.CODE = b.CODE
    FROM TABLEA a 
    INNER JOIN TABLEB b ON
    a.ID = b.ID
    WHERE CODE = '01'
```

DELETE

```
DELETE a FROM TABLEA a 
    INNER JOIN TABLEB b ON
    a.ID = b.ID
    WHERE CODE = '01'
```


# 文字列分割
普通のSUBSTRと違い０番目から始まらないので注意

```
SELECT SUBSTRING('TEST',2,2)

> ES
```

https://msdn.microsoft.com/ja-jp/library/ms187748%28v=SQL.120%29.aspx?f=255&MSPPError=-2147217396

# 文字列を日付型にして経過月数を算出

```
select datediff(month, try_convert(datetime, "19980101"),try_convert(datetime, "20080910")) / 12.0
```

# 文字列のエスケープ文字
シングルクォート二つ

```
select 'cat''s eye'

> cat's eye
```
# backup stripe
バックアップファイルを分割。すごく簡単。
ファイルサイズが大きいと単一ディスクに対しても速度があがるようです。

```
BACKUP DATABASE MY_DATABASE
TO DISK='c:\database\1.bak', 
DISK='c:\database\2.bak', 
DISK='c:\database\3.bak',
DISK='c:\database\4.bak'
WITH COMPRESSION -- 圧縮
GO
```

restore

``` restore
RESTORE DATABASE MY_DATABASE FROM  
DISK = N'C:\database\backup1.bak',  
DISK = N'C:\database\backup2.bak',  
DISK = N'C:\database\backup3.bak',  
DISK = N'C:\database\backup4.bak'
WITH  FILE = 1,  NOUNLOAD,  STATS = 10
GO
```

# Default with nolock hint

SQLServerはSelectで行ロックしてしまうのでnolock hintを書かないとウェイトしてしまう。
そんな時Defaultでnolockしたいときのquery。

```
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
```

※ トランザクション分離レベルが変わるので注意

# 全カラムを取得

```
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE DATA_TYPE = 'datetime2'
```

# 大文字、小文字変換
```
-- 小文字→大文字
  SELECT UPPER('abc');
-- 大文字→小文字
  SELECT LOWER('ABC');
```

# Triggerでのinsert delete update判定方法

https://social.msdn.microsoft.com/Forums/ja-JP/f142d826-0def-47f2-b3ee-1dd8d6d99573/sql-serverdmlinsertupdatedelete?forum=sqlserverja

```
if exists(select * from insertd) and
   exists(select * from deleted)
   --Update
else if exists (select * from inserted)
   --Insert
else if exists (select * from deleted)
   --Delete
else
   --どれでもない。
```

# FKのWITH NOCHECKを調べる方法とCHECKにするクエリを出力するクエリ

スタックオーバーフローの回答にありました。
https://stackoverflow.com/questions/529941/with-check-add-constraint-followed-by-check-constraint-vs-add-constraint

```sql
;WITH Untrusted (ConstraintType, ConstraintName, ConstraintTable, ParentTable, IsDisabled, IsNotForReplication, IsNotTrusted, RowIndex) AS
(
    SELECT 
        'Untrusted FOREIGN KEY' AS FKType
        , fk.name AS FKName
        , OBJECT_NAME( fk.parent_object_id) AS FKTableName
        , OBJECT_NAME( fk.referenced_object_id) AS PKTableName 
        , fk.is_disabled
        , fk.is_not_for_replication
        , fk.is_not_trusted
        , ROW_NUMBER() OVER (ORDER BY OBJECT_NAME( fk.parent_object_id), OBJECT_NAME( fk.referenced_object_id), fk.name) AS RowIndex
    FROM 
        sys.foreign_keys fk 
    WHERE 
        is_ms_shipped = 0 
        AND fk.is_not_trusted = 1       

    UNION ALL

    SELECT 
        'Untrusted CHECK' AS KType
        , cc.name AS CKName
        , OBJECT_NAME( cc.parent_object_id) AS CKTableName
        , NULL AS ParentTable
        , cc.is_disabled
        , cc.is_not_for_replication
        , cc.is_not_trusted
        , ROW_NUMBER() OVER (ORDER BY OBJECT_NAME( cc.parent_object_id), cc.name) AS RowIndex
    FROM 
        sys.check_constraints cc 
    WHERE 
        cc.is_ms_shipped = 0
        AND cc.is_not_trusted = 1

)
SELECT 
    u.ConstraintType
    , u.ConstraintName
    , u.ConstraintTable
    , u.ParentTable
    , u.IsDisabled
    , u.IsNotForReplication
    , u.IsNotTrusted
    , u.RowIndex
    , 'RAISERROR( ''Now CHECKing {%i of %i)--> %s ON TABLE %s'', 0, 1' 
        + ', ' + CAST( u.RowIndex AS VARCHAR(64))
        + ', ' + CAST( x.CommandCount AS VARCHAR(64))
        + ', ' + '''' + QUOTENAME( u.ConstraintName) + '''' 
        + ', ' + '''' + QUOTENAME( u.ConstraintTable) + '''' 
        + ') WITH NOWAIT;'
    + 'ALTER TABLE ' + QUOTENAME( u.ConstraintTable) + ' WITH CHECK CHECK CONSTRAINT ' + QUOTENAME( u.ConstraintName) + ';' AS FIX_SQL
FROM Untrusted u
CROSS APPLY (SELECT COUNT(*) AS CommandCount FROM Untrusted WHERE ConstraintType = u.ConstraintType) x
ORDER BY ConstraintType, ConstraintTable, ParentTable;

```

# カラムのデフォルト値を変更する方法

すでに存在すると以下のエラーが出力される。
Column already has a DEFAULT bound to it.

一度デフォルト値を削除して再設定する必要があります。

```sql
ALTER TABLE [dbo].[table] DROP CONSTRAINT [DF_table_column];

ALTER TABLE [dbo].[table]
    ADD  CONSTRAINT [DF_table_column] DEFAULT ((1)) FOR [isTest];
```

default名を指定していない場合消せないので、以下のクエリで取得できます。

```sql
EXECUTE [dbo].[sp_help] 'table'
GO
EXECUTE [dbo].[sp_helpconstraint] 'table'
GO
```