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ではあるでしょう。
No.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」を参照してください
詳しい説明ありがとうございます。
運用環境の設定を調べないことには確定しませんが、多分これであたりでしょう。
しかし、開発環境と運用環境で設定が違うという地雷のような状態の可能性があるわけですね(現に今回踏んじゃったわけで)…管理者に相談だぁ。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- MySQL SQLについて教えて下さい。 SELECT分で、あるカラムにある日付の 半年先のデータを取って来たい 3 2022/12/07 22:28
- Access(アクセス) アクセス 有効なフィールド名、または式として認識できませんのエラー 3 2022/08/19 11:53
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- PHP PHP MySql ページング 2 2022/09/20 06:38
- MySQL SQLです。下記の問合せを行うクエリを、PhpMyAdminで作成して実行せよ。 「昨年の各月の総降 1 2023/07/01 00:32
- MySQL SQLについて質問です。 SELECT TO_CHAR(TO_DATE('90-10-08.'YY- 4 2022/05/13 20:55
- SQL Server SQL ServerでDBを構築。これは開発? 4 2022/05/28 14:10
- Excel(エクセル) EXCELの「接続」のSQLのコマンド文字列にて、セルから任意の数値を利用したい 2 2023/03/09 16:43
- その他(プログラミング・Web制作) Rでのスクリプトのご相談 3 2022/12/08 16:22
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
select *, `人口(男)`AND`人口(...
-
2つのselect文をunion all で...
-
Oracle:グループごとに最大日...
-
差し込み後、元データを変更し...
-
SELECT 文 GROUP での1件目を...
-
for whichの使い方
-
SQLで特定の項目の重複のみを排...
-
エクセルで最後の文字だけ置き...
-
外部参照してるキーを主キーに...
-
重複していないレコードの抽出...
-
フィルターかけた後、重複を除...
-
列のヘッダーを含めるのをデフ...
-
INSERT文でフィールドの1つだ...
-
access2003 クエリSQL文に...
-
SQLServerで文字列の末尾からあ...
-
Unionの結果全体をOrder By し...
-
【VB.NET】日付型の列にNULLを...
-
日本語のエイリアスは" "で囲...
-
2つのテーブルを結合して最大値...
-
EXISTSを使ったDELETE文
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Oracle:グループごとに最大日...
-
SQL 複数のテーブルから重複な...
-
1つのカラムに複数レコードの...
-
SQLで小数点のついたべき乗を計...
-
select *, `人口(男)`AND`人口(...
-
set lineで不要な改行が出力さ...
-
アクセス SQLで重複排除でcount...
-
SQLServerのストアドで戻り値取...
-
select実行時のロックとcommit...
-
MAX値を条件にしたSQLで困って...
-
同一テーブル内のデータを比較...
-
2つのselect文をunion all で...
-
order by区の記述位置
-
東芝のDynabookで外付けのDVDド...
-
ブルースクリーンの対処法
-
LAST_DAY関数は?
-
Accessで2つのカラムからユニー...
-
SQL文 テーブル1つに複数のデータ
-
Access2000でディレクトリリス...
-
差し込み後、元データを変更し...
おすすめ情報