読者です 読者をやめる 読者になる 読者になる

checkpoint

自分用のIT技術系ノートです。古い情報や間違っている情報もあるので注意。

datetime型から時刻を取り去るいくつかの方法

SQL Serverでdatetimeから時刻を除去したいときってありますよね。 「本日0時時点のdatetime型データが必要!」というような場合、どのような方法が考えられるでしょうか。 SQL Server 2008の場合 SQL Server 2008では「date型」「time型」という新しいデー…

SELECT INTO句で一時テーブルを作成した場合、SELECTに空文字を指定しているとエラー(2000まで)

最近遭遇した謎なエラー。 SELECT '' AS col1 INTO #T このようなSQLを実行すると、以下のようなエラーになりました。 列 'col1' の幅が無効です: 0。 ところが同じSQLを別のSQLサーバー(2005)で動作させると正常終了。どうやらSQL Serverのバージョンが20…

FakeWorkTable

SQL Server 2005 + .NETアプリでこんなエラーが出たよ! System.Data.SqlClient.SqlException: 4 バイトの内部オーバーヘッドを含めて、最小行サイズが 16017 になるので、テーブル 'FakeWorkTable' を作成または変更できませんでした。このサイズは、テーブ…

Identity値を取得する3つの方法

SQL Serverで主キーなんかに使う型でIdentityってありますよね? IDとして自動的に連番を振り出してくれるヤツ。 自動的に付与される値なので(普通は)明示的に指定することができません。 行を登録した後に取得することになりますが、その際に利用できる構…

ADO(.NET) + SQL Serverでパラメータークエリを使った場合、ローカル一時テーブルが作成出来ない

最近職場の人が言っていた件。自分も前にこれでかなり悩んだものです。 PRB: ADO のパラメーター化されたクエリを使用すると SQL Server のローカル一時テーブルが作成されません。 ADO.NET 1.1 でも再現するこの現象。例えば以下のようなパラメータークエリ…

SQL Server 2005でデータベースから特定の名前の列を探すSQL

データベース内からある名前の列を探したい、しかしどのテーブルにあるかわからない、という場合がしばしばあります。ドキュメントがちゃんと作成・保守されていればそれを見れば済むことなのですが、「テーブル定義書?なにそれ」「E-R図?おいしいの?」な…

カンマを含む数値文字列をdecimalにキャストするとエラー

Transact-SQL内で文字列を数値にキャストすることはよくあると思いますが、'10,000'みたいに、桁区切りのカンマが入っている場合も多いでしょう。 カンマが入っていてもISNUMERIC関数でTrueが返されます。 しかしこれをこのままdecimalにキャストしようとす…

ADO.NET経由でSQLがデッドロックになった場合、SqlCommand.ExecuteReaderメソッドがエラーにならないことがある件

やばい、これ今日初めて知ったんだけど。というか、このせいで半日くらい潰されました。MSDNにもしっかり書いてありますね。引用。 トランザクションがデッドロック状態になると、 Read が呼び出されるまで、例外はスローされない可能性があります。 Framewo…

排他ロックされません

SELECTを投げるとき、インデックスのみの検索で事足りる場合は、インデックスにしかロックがかかりません。 この場合は、ヒントで排他ロックをかけるよう指示していたとしても実データにロックをかけてくれません。 項目の多いカバリングインデックスなんか…

キャッシュのクリア

クエリのパフォーマンス計測に。DBCC DROPCLEANBUFFERSデータバッファキャッシュをクリア。 結果セットをキャッシュから再利用されたくない場合に使用。 DBCC FREEPROCCACHEプロシージャキャッシュをクリア。 SQLステートメントがキャッシュから再利用されず…

トランザクション分離レベルとロックヒント

トランザクション分離レベル READ UNCOMMITTED 共有ロックをかけない。ダーティリード可。 READ COMMITTED (SQL Serverデフォルト) リソースを使用してるときだけ共有ロックをかける。反復不可能読み取り。 REPEATABLE READ トランザクションの終了まで共有…

datetime型の精度

SQL Serverのdatetime型の精度は3.333..ミリ秒。 下一桁が0,3,7の順に進んでいく。 従って、>= '2005/11/25 00:00:00' AND とか BETWEEN '2005/11/25 00:00:00' AND '2005/11/25 23:59:59' とか指定していると、'2005/11/25 23:59:59.237'などと なっている…

CASE式

これもいざ使おうという時に限って微妙に構文を忘れてたりする。 CASE 式 WHEN 式 THEN 式 ... [ELSE 式] END CASE式=WHEN式のとき、THEN式が返される。 CASE WHEN 条件 THEN 式 ... [ELSE 式] END WHEN条件が真のとき、THEN式が返される。

SQL ServerへADO.NETアプリからの接続エラー

職場でよく知らない人からアプリが動かないと連絡あり。 とりあえずエラーメッセージを送ってもらうと、 SQL Serverが存在しないか、アクセスが拒否されました どうも接続を開けようとして失敗しているみたい。 ネットワーク的には問題なし。他に同様の症状…

SQL Serverから別のデータソースにアクセス

OPENQUERY(サーバー名,'ステートメント') リンクサーバーの設定が必要 OPENROWSET('OLE DBプロバイダ名','データソース名';'ユーザーID';'パスワード','ステートメント'もしくはテーブル名) セミコロンの位置に注意 INSERT INTO OPENROWSET(...で書き込み可…