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
 
以上、本日の失敗談でした。
 

0 件のコメント: