既存のレコードが既に存在する場合は編集し、存在しない場合は作成する必要があるWindowsフォームアプリケーションがあります。私はSQL Server 2008 R2を使用しています。私のアプリケーションは、レコードがすでに存在する場合、出力テーブルのIDフィールドを含むさまざまなテーブルからデータを読み込みます。SQLマージを使用してレコードを更新または挿入する方法
新しいレコードが作成されると、IDフィールドは空白になります。 IDフィールドは、主キーであり、宛先テーブルのID(自動増分)フィールドです。
MERGEを使用してストアドプロシージャを作成しましたが、新しいレコードを作成したり、既存のレコードを更新したりすることができます。更新部分は動作していますが、作成するときにIDフィールドをどうするかわかりません。
私はIDパラメータを渡すと、既存のレコードが更新されます。明らかにそれが新しいレコードであれば私はまだIDを持っていませんが、私はそのパラメータを残しておくことはできません。あるいは、あなたが予想していたように、割り当てられていない変数エラーが出ます。
ここに私のストアドプロシージャがあります。私はちょうど間違った木をここで吠えていますか どこか?
2つのストアドプロシージャを作成して、私が持っていればUpdateを呼び出し、IDとCall Createを持っていてIDがなければいいですか?
ありがとうございます。
USE [Insurance]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[CreateModifyValuation]
-- Add the parameters for the stored procedure here
@ValuationID int,
@OwnersCorporationID int,
@ValDate datetime,
@ValuerID int,
@Amount money,
@Printed bit,
@Approved bit,
@Notes varchar(max),
@MultiplierValue money,
@MultiplierClass char(10),
@Adjustment money,
@SubmittedDate datetime
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
Merge Valuation as Target
USING (Select
@ValuationID,
@OwnersCorporationID,
@ValDate,
@ValuerID,
@Amount,
@Printed,
@Approved,
@Notes,
@MultiplierValue,
@MultiplierClass,
@Adjustment,
@SubmittedDate
)
As Source(
ValuationID,
OwnersCorporationID,
ValDate,
ValuerID,
Amount,
Printed,
Approved,
Notes,
MultiplierValue,
MultiplierClass,
Adjustment,
SubmittedDate
)
ON Source.ValuationID = Target.ValuationID
WHEN MATCHED THEN
UPDATE SET
Target.OwnersCorporationID = Source.OwnersCorporationID,
Target.ValDate = Source.ValDate,
Target.ValuerID = Source.ValuerID,
Target.Amount = Source.Amount,
Target.Printed = Source.Printed,
Target.Approved = Source.Approved,
Target.Notes = Source.Notes,
Target.MultiplierValue = Source.MultiplierValue,
Target.MultiplierClass = Source.MultiplierClass,
Target.Adjustment = Source.Adjustment,
Target.SubmittedDate = Source.SubmittedDate
WHEN NOT MATCHED BY Target THEN
INSERT (
OwnerscorporationID,
ValDate,
ValuerID,
Amount,
Printed,
Approved,
Notes,
MultiplierValue,
MultiplierClass,
Adjustment,
SubmittedDate
)
VALUES (
Source.OwnersCorporationID,
Source.ValDate,
Source.ValuerID,
Source.Amount,
Source.Printed,
Source.Approved,
Source.Notes,
Source.MultiplierValue,
Source.MultiplierClass,
Source.Adjustment,
Source.SubmittedDate
);
END
あなたのMERGE文は、私には罰金だが、私は問題を理解していない - 新しいレコードを挿入するとき、あなたはすべてのエラーを得るのですか? –
私はあなたの質問を誤解している可能性があります.MERGEはうまく見えますが、 '@ ValuationId'パラメータをnullにすることはできませんか? (例: '@ValuationID int = NULL') –
私のC#プログラムで、ValuationIDにintを代入しようとすると、コンパイル時にエラーが発生する"ヌルに変換できないため、nullを 'int'に変換できない値の型 "を指定します。だから私は一度ValuationIDとOnce Witthoutで私のSPに電話する必要があり、私は両方の方法でそれを行う方法がわかりません。 –