SQLServer日付の精度

datetime型は、0.333秒(というのは誤りで、3ミリ秒単位の様だ。後述)
datetime2型は、100ナノ秒 0.0000001

同じように現在日時を取得する関数も
getdate() 0.333秒
sysdatetime() 100ナノ秒 0.0000001

select getdate(), sysdatetime()

ws000015

追記
0.333秒というのは誤っている模様

Codezineの記事には「クロックティック数(1ティック=3.33ミリ秒)」と書いてある。
『SQL Serverにおける日付/時刻計算のベストプラクティス』

ウィキペディア「システム時刻」でも3msとある

SQLServerメッセージをリアルタイムに出力する。RAISERROR

PRINT だとクエリーが終わらないと表示されない

すぐに!リアルタイムに!出すにはRAISERRORを使う

例えば

declare @i int=0
declare @now varchar(50)  --LOG AREA
while @i < 10000000
begin
    if @i % 100000 = 0
    begin 
        set @now = CONVERT(varchar,GETDATE(),114)  --LOG TIME
        raiserror('%s value=%d', 0, 0, @now, @i) with nowait  --DEBUG PRINT
    end
    set @i += 1
end

第1引数は、formatのように記述する。%d に代入する値は第4引数以降で指定する
第2引数は、重大度
第3引数は、エラー番号

エラーを強制定期に発生させているようなので、自己責任でご使用ください。

リンク
RAISERROR (Transact-SQL) – MSDN – Microsoft

BCPインポートで22008のエラーが出る

コピーを開始しています…
SQLState = 22008, NativeError = 0
Error = [Microsoft][SQL Server Native Client 10.0]日付の形式が正しくありません。

コピーを開始しています…
SQLState = 22008, NativeError = 0
Error = [Microsoft][ODBC Driver 11 for SQL Server]Invalid date format

◆原因はフォーマットファイル作成と、エクスポートの型が異なっていたため。

フォーマットファイル作成時は、-c(文字型)としているが、エクスポート時は-n(ネイティブ型)となっている。

bcp format -c

bcp queryout -n

◆解決!
フォーマットファイルを-n(ネイティブ型)で作成しなおすことで解決!
bcp format -n

sp_configure ‘optimize for ad hoc workloads’,1 エラー 15123

SQLServer2014で

sp_configure ‘optimize for ad hoc workloads’,1
を実行するとメッセージ 15123 で失敗する。

事前に
sp_configure ‘show advanced option’,1
が必要だった

参考
http://blog.sqlauthority.com/2009/03/26/sql-server-fix-error-msg-15123-level-16-the-configuration-option-advance-option-does-not-exist-or-it-may-be-an-advanced-option/

SQL SERVERスクリプトで、制約付きのカラムを削除する

Default定義したカラムを削除するには。

SQLServer Management Studioから手動するのは簡単ですが、
これをスクリプトから行いたい。

参考にしたサイトがまんまです。

キモは、
制約の削除をEXEC の中でやってるところですね。

EXEC(‘ALTER TABLE ‘+ @TABLE_NAME + ‘ DROP CONSTRAINT ‘ + @CONSTRAINT_NAME)

すばらしい! まったく閃きませんでした。

フルテキスト インデックスに格納されているキーワード

「指定されたテーブルに関連付けられているフルテキスト インデックスのドキュメント レベルのコンテンツに関連する情報を返します。」
と、マイクロソフトのページに書かれている
sys.dm_fts_index_keywords_by_document (Transact-SQL)

で、つまり
こんなSQLで SQLServerのfulltextインデックスの解析された内容が見えた。
(と思う)

SELECT * 
FROM sys.dm_fts_index_keywords_by_document 
( db_id(N'db-name'), OBJECT_ID(N'table-name'))

1つの文書で1万件ぐらいあるね。

データベース名、テーブル名をN” でくくるのが今回のミソだね。

で、重複した文字を除くのであれば、こんなかんじで

SELECT distinct display_term 
FROM sys.dm_fts_index_keywords_by_document 
( db_id(N'db-name'), OBJECT_ID(N'table-name') )

SQLServerテーブルのデザイン変更が保存できないとき

テーブルのデザイン変更が保存できない。

やりたいことは
列を途中に挿入したい。

変更の保存が許可されていません。
行った変更には、次のテーブルを削除して再作成することが必要になります。
再作成できないテーブルに変更を行ったか、
テーブルの再作成を必要とする変更を保存できないようにするオプションが有効になっています。

ツール > オプション > Designers
テーブルの再作成を必要とする変更を保存できないようにする

チェックを外す

で、
デザイン画面での変更が保存できるようになった。

変更スクリプトの作成 で保存時にSQLServerが
やっている事を見てみると、先の警告メッセージで散々登場している「再作成」を
している。このスクリプトを取る(作成する)だけでも使える。。。

1.新しいデザイン内容でテーブル作成(新テーブル)
CREATE TABLE
2.変更したいテーブル(旧テーブル)から新テーブルにデータコピー
Insert
3.旧テーブルの削除
DROP TABLE
4.新テーブルのテーブル名変更
sp_rename
5.インデックスの作成

Service Brokerが有効になっているかを確認するには?

ENABLE_BROKER するように言われたけど。。。

ALTER DATABASE [dbname] SET ENABLE_BROKER WITH ROLLBACK IMMEDIATE

WITH ROLLBACK IMMEDIATE を付けないと、
使用中のデータベースに対してはいつまでたっても終わらない

で、確認方法です。
Service Broker がアクティブかを判断するには、
sys.databasesカタログビューの is_broker_enabled列を確認します。

select name, is_broker_enabled from sys.databases

is_broker_enabled
1 = このデータベースのブローカは現在メッセージを送受信中です。
0 = このデータベースでは、すべての送信メッセージは転送キューにとどまり、受信メッセージはキューに配置されません。

参考サイト
http://www.sql-server-performance.com/forum/threads/how-to-see-if-service-broker-is-enabled.26046/

sys.databasesについての説明
http://lab.technet.microsoft.com/ja-jp/library/ms178534.aspx