ページ

ラベル SQL Server の投稿を表示しています。 すべての投稿を表示
ラベル SQL Server の投稿を表示しています。 すべての投稿を表示

2007-08-01

SQL Serverの文字列は単一引用符で囲む

「何を今更」ですが、今日 SQL Serverでやっつけのスクリプトを書いていたときの話。
 
あるテーブルに氏名1、氏名2の2つの氏名欄があって、氏名2が入力されている場合は氏名2を、氏名2が入力されていない場合は氏名1を出力しようとしました。
ちなみに氏名2が未入力の場合はNULLではなく空白になっています。
 
CASE演算子を使ってサクっと完成。
SELECT
        CASE WHEN RTRIM(KanjiName2) = ""
                THEN KanjiName1
                ELSE KanjiName2
        END AS KanjiName
FROM
        NameTable
照会だけなので何も考えずに実行。  
メッセージ 1038、レベル 15、状態 4、行 2
オブジェクト名または列名がないか、空です。SELECT INTO ステートメントの場合は、各列に名前が付いていることを確認してください。その他のステートメントの場合は、空の別名を検索してください。"" または [] で定義された別名は許可されません。別名として、名前または 1 つのスペースを追加してください。
何やら見慣れないエラーが表示されました。
SELECT INTOなんか使ってないので余計分かりにくいですね。
 
しばらく無言で画面を見つめること数分...。
SELECT
        CASE WHEN RTRIM(KanjiName2) = ""
                THEN KanjiName1
                ELSE KanjiName2
        END AS KanjiName
FROM
        NameTable
 
あ。

文字列の引用符間違えてたよ...。
 
「実はこの作業の直前にVBAの事を聞かれていたんですよ...」という言い訳は置いておいて、一応ヘルプで誤りを再確認。
接続に対して QUOTED_IDENTIFIER オプションが OFF に設定されている場合は、文字列を二重引用符で囲むこともできます。ただし、Microsoft SQL Native Client Provider と ODBC ドライバでは、自動的に SET QUOTED_IDENTIFIER ON が使用されます。単一引用符を使用することをお勧めします。
ほぅほぅ。QUOTED_IDENTIFIERオプションなるものがあるのですね。
早速スクリプトを修正。
SET QUOTED_IDENTIFIER OFF
SELECT
        CASE WHEN RTRIM(KanjiName2) = ""
                THEN KanjiName1
                ELSE KanjiName2
        END AS KanjiName
FROM
        NameTable
これでよし(違
SELECT
        CASE WHEN RTRIM(KanjiName2) = ''
                THEN KanjiName1
                ELSE KanjiName2
        END AS KanjiName
FROM
        NameTable
 
以上、本日の失敗談でした。
 

2007-07-18

インデックスの再編成と再構築

SQL Server 2005でメンテナンスプランを作成していると、 インデックスの再編成とインデックスの再構築というものがありました。
ちなみに SQL Server 2000のときはインデックスの再構成でした。
 
訳語を統一してください(笑
 
インデックスの再編成と再構築
 
インデックスの再編成
  • クラスタ化インデックスと非クラスタ化インデックスの断片化が解消される。
  • インデックスページが圧縮される。不必要になったページは削除される。
  • 再編成はオンラインで実行される。実行中のクエリ・更新はブロックされない。
  • インデックスの断片化が多くない場合は再編成するとよい。
インデックスの再構築
  • 既存のインデックスを削除して新しいインデックスを作成する。
  • 新しいインデックスは連続するページに並べ替えられる。
  • 再構築はオンライン・オフラインいずれでも実行可能。
今回は利用者のいない夜間のバックアップなので、オフラインで再構築を実行することにしました。
 

2007-07-17

メンテナンスプランの作成時にエラー

SQL Server 2005でバックアップ用のジョブを作成しようとしたところエラーが発生しました。
メンテナンス プランを作成できませんでした。
追加情報
JobStep 'サブプラン'の作成に失敗しました。(Microsoft.SqlServer.MaintenancePlanTasks)
  Transact-SQL ステートメントまたはバッチの実行中に例外が発生しました
  (Microsoft.SqlServer.ConnectionInfo)
    指定した'@subsystem'は無効です (有効な値が sp_enum_sqlagent_subsystem から返されます)。(Microsoft SQL Server、エラー:14234)
 
エラーメッセージで検索したところ、Integration Servicesをインストールしろとの事。 自動翻訳ですが、日本語の情報もありました。 自動翻訳されることにより余計に意味が分かりにくくなっていますね。
 
エラーメッセージの例まで翻訳したら検索できないだろ(笑
 
更にこのマシンは Business Intelligence Development Studioこそインストールしていないものの Integration Servicesはインストール済みだったので該当しないようです。
 
その後しばらく悩んでいたのですが SQL Server 2005 SP2が入っていない事に気付いてインストールしたところ、あっさりと動くようになってしまいました。
もしかしたらこのあたりが原因だったのでしょうか?