2016-12-22 12 views
1

既存のレコードが既に存在する場合は編集し、存在しない場合は作成する必要がある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 
+0

あなたのMERGE文は、私には罰金だが、私は問題を理解していない - 新しいレコードを挿入するとき、あなたはすべてのエラーを得るのですか? –

+1

私はあなたの質問を誤解している可能性があります.MERGEはうまく見えますが、 '@ ValuationId'パラメータをnullにすることはできませんか? (例: '@ValuationID int = NULL') –

+0

私のC#プログラムで、ValuationIDにintを代入しようとすると、コンパイル時にエラーが発生する"ヌルに変換できないため、nullを 'int'に変換できない値の型 "を指定します。だから私は一度ValuationIDとOnce Witthoutで私のSPに電話する必要があり、私は両方の方法でそれを行う方法がわかりません。 –

答えて

0

私はだまさように私は感じるが、それは私が前にこの行を追加したどのように悪い、それは私のSQLでは:)

できるように一行だけだ「SET NOCOUNT ON;」

(私は構文エラーを取得ON SET NOCOUNT後にそれを置けばおかしいが)

if (@ValuationID = 0) set @ValuationID = null 

はその後、私のC#コードで、私は新しいレコードのために0にIDを設定し、カップルの後に動作するようですテストのこれを行うより良い方法があるかもしれませんが、人生のほとんどの事のように、一度それが動作したら、あなたは見ることをやめます。 コメントをお寄せいただきありがとうございました。

デビッド

関連する問題