アプリ版:「スタンプのみでお礼する」機能のリリースについて

SQL Server+SQL クエリアナライザ上で実行するSQLのスクリプトを書いていて、DATEADD 関数の書き方で困りました。

現在の日時から1ヶ月後を表示するには、
(1)  select DATEADD(Month, 1, GetDate())
でできますが、このときの日付要素の引数 Month には省略形が使えることになっています。
(2)  select DATEADD(mm, 1, GetDate())
(3)  select DATEADD(m, 1, GetDate())
で、このときに、ASPの癖で、ダブルクォートで囲って
(4)  select DATEADD("m", 1, GetDate())
とやってしまったんんですが。

上記(4)の記述方法でも、開発環境では文法エラーにもならず、実行結果も期待した値が表示されました。
ところがそれを運用環境のSQL クエリアナライザで文法チェックしたら、
「パラメータ1はdateaddでは指定できません」
というメッセージがでてしまいました。
(1)の記述方法に変えたら、運用環境でも問題なく実行するようになったのですが、まったく納得いきません。
例えば実行させるクエリアナライザのバージョンによって、日付要素の引数の書き方が違うというような事があるのでしょうか?
MSのサイトで検索しても見つからなかったのですが、捜しかたが悪いでしょうか。
同じようなことを他でもやってる可能性もあり、原因を特定させないととても怖いです。

開発環境は
  SQL Server Standard Edition 7.00.1063
  SQLクエリアナライザ Version SQL 8.00.760
  OSは…確認しそびれました。
運用環境は
 すぐには判らないのですが、SQL Server7.0ではあるでしょう。

A 回答 (1件)

SQL Serverでは


・テーブルや列名などは「識別子」
・文字列や数字などは「リテラル」
と呼ばれています。
それぞれを区別するために通常は、
識別子はそのまま表記し
リテラルにシングルクォーテションで括って表記します
dateaddのdは識別子なのでそのままでの表記になります

しかしSQL-92(国際規格)では識別子をダブルクォーテーションで括る表記を認めているため
SQL ServerではSQL-92の表記をサポートするためのオプションが存在します

SET QUOTED_IDENTIFIER OFF
select dateadd("d",1,getdate()) --エラーになります
select "ABC" as col1 --正常に動作します

SET QUOTED_IDENTIFIER ON
select dateadd("d",1,getdate()) --正常に動作します
select "ABC" as col1 --エラーになります

クエリアナライザでは規定値でOFFの状態となっています
変更は[ツール]-[オプション]-[スクリプト]や上記のSETコマンドを使用することで可能です

一方Accessなどではリテラルをダブルクォーテーションで括る事があるので
ツールの方から自動的に上記のコマンドが暗黙的に実行されOFFになっているようです

SQL Server2000で確認しましたが、多分Ver7でも同じだと思います
詳しくはクエリアナライザのヘルプで「SET QUOTED_IDENTIFIER」を参照してください

この回答への補足

ありがとうございました。審査通りました。

補足日時:2006/01/20 22:27
    • good
    • 0
この回答へのお礼

詳しい説明ありがとうございます。
運用環境の設定を調べないことには確定しませんが、多分これであたりでしょう。
しかし、開発環境と運用環境で設定が違うという地雷のような状態の可能性があるわけですね(現に今回踏んじゃったわけで)…管理者に相談だぁ。

お礼日時:2006/01/19 07:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!