申し訳ありませんが、これは一種の 2 つの部分からなる質問です。
私は SQL に非常に慣れておらず、勤務している小さなオフィス用のタイム レコーダー アプリケーションを開発しようとしています。現在、SQL バックエンドをいじっていて、複合ステートメントについて質問があります。
私が立ち往生しているのは、ユーザーが休憩のために出勤しようとしたが、シフトの開始時に出勤しなかった場合、SQL は既存の行を更新するのではなく、新しい行を作成する必要があることです。
これが私が試したものです:
IF NOT EXISTS(SELECT * FROM Clock WHERE clockDate = '08/10/2012') AND userName = 'test')
BEGIN
INSERT INTO Clock(clockDate, userName, breakOut)
VALUES({ fn NOW() }, 'test', { fn NOW() })
END
ELSE
BEGIN
UPDATE Clock
SET breakOut = { fn NOW() }
WHERE (clockDate = '08/10/2012') AND (userName = 'test')
END
Visual Studio 2010 を使用して、ローカル マシン上の SQL Server Express 2008 に接続してこれを実行しています。「The Compound statement SQL construct or statement is not supported.」というエラーが表示されます。ただし、その後に 1 行が影響を受けているというメッセージが表示され、Clock テーブルを表示すると、予想どおりに表示されます。これを達成するための最良の方法は何ですか?
この質問の 2 番目の部分は、WHERE ステートメントにあります。今日の日付を入力するのではなく、clockDate 列に今日の日付を取得する関数はありますか? フロントエンドアプリケーションを構築するために先を考えようとしているだけです。
IF NOT EXISTS(SELECT * FROM Clock WHERE clockDate = { fn CURRENT_DATE() }) AND userName = 'test')
繰り返しますが、これで必要な結果が得られますが、「'CURRENT_DATE' 付近の WHERE 句でエラーが発生しました。クエリ テキストを解析できません」というエラーが表示されるまでは結果が得られません。
私はこれを適切に説明したことを願っています、そしてあなたの助けに感謝します!!
編集:
@Rトーマス @w00te
では、clockDate を日付フィールドとして、breakOut を time(0) フィールドとして使用すると、うまくいくでしょうか? 「The Compound statement SQL construct or statement is not supported.」というメッセージがまだ表示されます。動作しているように見えますが、構文エラーです。
IF NOT EXISTS (SELECT * FROM Clock WHERE (clockDate = GETDATE()) AND (userName = 'test'))
BEGIN
INSERT INTO Clock(clockDate, userName, breakOut)
Values(GETDATE(), 'test', GETDATE())
END
ELSE
BEGIN
UPDATE Clock
SET breakOut = GETDATE()
WHERE (clockDate = GETDATE()) AND (userName = 'test')
END
私のテーブルの結果は次のとおりです。
clockDate userName clockIn breakOut breakIn clockOut
08/10/2012 test NULL 11:24:38 NULL NULL
これは私が望む結果ですが、このエラーは私を混乱させます。これは Visual Studio エラーですか、それとも SQL エラーですか? そして、Merge Statements を読み上げます。リンクをありがとう。