====== SQLServer ======
===== ライフサイクル一覧 =====
^製品名^サポート開始日^延長サポート終了日^
|SQL Server 2019|2019/11/04|2030/01/08|
|SQL Server 2017|2017/09/29|2027/10/12|
|SQL Server 2016|2016/06/01|2026/07/14|
|SQL Server 2014|2014/07/12|2024/07/09|
===== 日時変換 =====
日時変換はCONVERT関数を使うのが一般的ですが、書式変換があまり直感的ではない。\\
SQLServer2008 R2以降では、FORMAT関数が使えます。\\
SELECT CONVERT ( VARCHAR, GETDATE(), 111 ) as 日付1
, CONVERT( VARCHAR , GETDATE (), 108 ) as 時刻1
日付1 時刻1
2016/10/26 17:33:32
SELECT FORMAT( GETDATE (), 'yyyy/MM/dd' ) as 日付2
, FORMAT( GETDATE (), 'HH:mm:ss' ) as 時刻2
日付2 時刻2
2016/10/26 17:33:32
==== 日付のみで抽出 ====
SQLServer 2008からは日付のみのDate型が使えるようになったので、DateTime型をDate型にキャストすることで日付のみの抽出を行う。
SELECT * FROM TICKET
WHERE CAST(OccurredDate AS DATE) >= CAST(GetDate() AS DATE)
==== 文字列日時からDateTime型に変換 ====
SQLServerのSTUFF関数で半角スペースと':'を挿入し、yyyyMMdd HH:mm:ss形式にすることで、CONVERT関数そのままDateTime型にキャストすることが可能。
SELECT CONVERT(DateTime,stuff(stuff(stuff('20210122235959', 9, 0, ' '), 12, 0, ':'),15, 0, ':'))
結果\\
2021/01/22 23:59:59
===== コマンドライン実行 =====
SQL ServerをCUIで管理するツールとしては、現在ではsqlcmdが推奨されているが、それ以外にもisql(廃止)やosql(非推奨)というコマンドもある(あった)\\
==== 表示値 (N/A)となる場合 ====
"EXIT()"で囲むことで、ERRORLEVELにリターン値として格納することができます。\\
BOM監視の設定にて、プログラム名「sqlcmd」で引数「-U Fuga -P Hoge -h-1 -Q "EXIT(set nocount on select '0')"」とする。※osqlのままでは駄目だった\\
参照:[[http://itdiary.info/%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9/post-322/|【コマンドプロンプト】cmdでSQLの結果を変数に取得する方法]]
==== 値が取得できない場合 ====
スクリプトの先頭に「SET NOCOUNT ON」を入れることで「何件処理されました。」の処理件数が非表示となり、ERRORLEVELにリターン値をセットされます。
===== トレース実行 =====
SQL Server Profilerのトレース機能を使用するためには、実行するにはユーザーにAlter Traceアクセス権限を許可する必要があります。
参照:[[http://www.innoya.com/Board/ViewTip.aspx?menuID=4&idx=257|SQL Server Profilerの実行権限設定 / 許可 / 拒否 / プロファイラー]]
USE [master]
GRANT ALTER TRACE TO [T_RESULT]
===== WHERE条件時に末尾空白を無視 =====
[[http://blog.engineer-memo.com/2014/12/20/sql-server-%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E5%8F%AF%E5%A4%89%E9%95%B7%E6%96%87%E5%AD%97%E5%88%97%E3%81%AE%E6%9C%AB%E5%B0%BE%E3%81%AE%E7%A9%BA%E7%99%BD%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/|SQL Server における可変長文字列の末尾の空白について]]\\
SQLServerのvarchar型は末尾空白をセットすることが出来るが、「WHERE条件時に末尾空白無視する仕様」になっている。
これは、ANSI/ISO SQL-92 specification にのっとった仕様でバグではありません。\\
※Oracleはverchar2型で末尾空白は無視しない。※[[http://www.shift-the-oracle.com/element/data-type/varchar2-char-comparison.html|文字列比較セマンティクス]]
===== パラメータークエリ =====
プレースホルダーは「@」となる。@NAMEとして使用する。ちなみに、Oracleのプレースホルダーは「:」である。
===== SSMSの結果グリッドの文字が小さい =====
SSMS のフォント設定は、「ツール」→「オプション」→「環境」→「フォントおよび色」から変更することができます。\\
変更する対象としては、「クエリ」「結果」「メッセージ」の 3 箇所あります。
結果グリッドのフォントを6ptから9ptに変更し、SSMSを再起動する。
参照:[[https://blog.engineer-memo.com/2015/09/23/sql-server-%e3%83%87%e3%83%a2%e7%92%b0%e5%a2%83%e7%94%a8%e3%81%ae%e3%83%95%e3%82%a9%e3%83%b3%e3%83%88%e8%a8%ad%e5%ae%9a/|SQL Server デモ環境用のフォント設定]]
===== 証明書エラー =====
SQLサーバーへの接続で以下のようなエラーが発生する場合の対処法です。
>信頼されていない機関によって証明書チェーンが発行されました。
接続文字列に「TrustServerCertificate=True」を追加します。
var connectionString = "Server=.;database=my_db;TrustServerCertificate=True";
[[https://tech.tinybetter.com/Article/7b5d05c8-de00-2985-ebb7-3a00e1e23073/View|SQLサーバーへのアクセスで証明書のエラーが出る場合の対処法(信頼されていない機関によって証明書チェーンが発行されましたというエラー)]]