[解決済み] SQL Server IF NOT EXISTSの使用法?
2022-03-01 18:07:08
質問
OK、では私のスキーマはこれです。
テーブル タイムシート_時間
列です。
- タイムシートID (PK, int)
- スタッフID (int)
- BookedHours (int)
- 投稿フラグ (ブール値)
これは極めて単純化されたテーブルですが、この説明の目的には十分役立つでしょう。一人の人が持つタイムシートレコードは1つだけだと仮定します。
私が行おうとしているのは、WorkLogという別のテーブルにレコードを追加することです。このテーブルの各レコードには、時間が関連付けられています。このテーブルが更新されると、Timesheet_Hoursも更新したいのです。
Timesheet_Hoursを更新する前に、まず該当するTimesheetがすでに投稿されていないかどうか、そして、そもそも更新すべきレコードがあるかどうかを確認したいと思います。
if文の最初の部分、つまりタイムシートがすでに計上されていないことを確認する部分は問題なく動作します。問題は2番目の部分です。更新しようとするレコードがすでに存在するかどうかをチェックしています。問題は、常にエラーを発生させることです。
注:以下のコードは、WorkLogテーブルの更新、挿入、および削除トリガーによって実行されるストアドプロシージャから抜粋したものです。PersonIDは、そのテーブルのパラメータの1つです。このストアド プロシージャは、このステートメントの 2 番目の部分をコメントアウトすると正常に動作します。
IF EXISTS
(
SELECT 1
FROM Timesheet_Hours
WHERE Posted_Flag = 1
AND Staff_Id = @PersonID
)
BEGIN
RAISERROR('Timesheets have already been posted!', 16, 1)
ROLLBACK TRAN
END
ELSE
IF NOT EXISTS
(
SELECT 1
FROM Timesheet_Hours
WHERE Staff_Id = @PersonID
)
BEGIN
RAISERROR('Default list has not been loaded!', 16, 1)
ROLLBACK TRAN
END
解決方法は?
Staff_Id = @PersonID となる行が実際に存在することを確認しましたか? 投稿された内容は、行が存在すると仮定して、テストスクリプトで問題なく動作します。 insertステートメントをコメントアウトすると、エラーが発生します。
set nocount on
create table Timesheet_Hours (Staff_Id int, BookedHours int, Posted_Flag bit)
insert into Timesheet_Hours (Staff_Id, BookedHours, Posted_Flag) values (1, 5.5, 0)
declare @PersonID int
set @PersonID = 1
IF EXISTS
(
SELECT 1
FROM Timesheet_Hours
WHERE Posted_Flag = 1
AND Staff_Id = @PersonID
)
BEGIN
RAISERROR('Timesheets have already been posted!', 16, 1)
ROLLBACK TRAN
END
ELSE
IF NOT EXISTS
(
SELECT 1
FROM Timesheet_Hours
WHERE Staff_Id = @PersonID
)
BEGIN
RAISERROR('Default list has not been loaded!', 16, 1)
ROLLBACK TRAN
END
ELSE
print 'No problems here'
drop table Timesheet_Hours
関連
-
[解決済み] SQLクエリで2つの列から値を引き算する
-
[解決済み] SQL ServerでSELECTからUPDATEする方法とは?
-
[解決済み] SQL Server で複数行のテキストを 1 つのテキスト文字列に連結する方法
-
[解決済み] SQL Server テーブルにカラムが存在するかどうかを確認する方法は?
-
[解決済み] SQL Server の DateTime データ型から日付だけを返す方法
-
[解決済み] SQL ServerにおけるLEFT JOINとLEFT OUTER JOINの比較
-
[解決済み] SQL Server にテーブルが存在するかどうかを確認する
-
[解決済み] SQL Serverでストアドプロシージャ内のテキストを検索する
-
[解決済み】SQL Serverで既存のテーブルにデフォルト値を持つカラムを追加する
-
[解決済み] SQL ServerでINNER JOINを使用して削除するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】「パラメータ@objnameがあいまいか、主張する@objtype(COLUMN)が間違っています」を解決するにはどうすればよいですか?[重複している]。
-
[解決済み】SQLが単一グループのグループ関数でないこと
-
[解決済み】一括読み込みデータ変換エラー(切り捨て)
-
[解決済み] ORA-01790: 式は、対応する式と同じデータ型でなければならないエラーが発生するケース
-
[解決済み] ORA-00920: 無効な関係演算子
-
[解決済み] SELECT DISTINCTを指定した場合、ORDER BY項目は必ず選択リストに表示されます。
-
[解決済み] varchar 値の変換で int カラムがオーバーフローしました。
-
[解決済み] ORA-00918: 列があいまいに定義されています」を解決する方法
-
[解決済み] CLOBとNCLOBの違いは何ですか?
-
[解決済み] SQLで複数のGROUP BYを使用する場合とは?