====== 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サーバーへのアクセスで証明書のエラーが出る場合の対処法(信頼されていない機関によって証明書チェーンが発行されましたというエラー)]]