0

というデータベースの SQL テーブルにアクセスするデータ リポジトリ レイヤーがありますForm

MergeGUID である新しい Id を挿入し、ID が既に存在する場合はレコードを更新するステートメントを作成しようとしています。ただし、私の問題は、ID が作成されていない場合、ID がわからないことです。

私はそれを理解することができません。これは、私の声明が実際に機能するかどうかを考えさせられました。

これは私のコードです:

conn.ExecuteScalar<Guid>(
"MERGE INTO [dbo].[Form] AS TARGET USING(VALUES(@Id,@CreatedAt,@IsComplete,@Data)) AS SOURCE(Id,CreatedAt,IsComplete,[Data]) " + 
"ON TARGET.Id = SOURCE.Id WHEN MATCHED THEN " +
"UPDATE SET CreatedAt = SOURCE.CreatedAt,IsComplete = SOURCE.IsComplete, [Data] = SOURCE.[Data] " +
"WHEN NOT MATCHED BY TARGET THEN " +
"INSERT(Id,CreatedAt,IsComplete,[Data]) " +
"VALUES(newId(),CreatedAt,IsComplete,[Data]) OUTPUT INSERTED.Id " +
"new{Id = ??????, CreatedAt = enquiry.EnquiryDate, IsComplete = 1, Data = doc});

Id の New に何を入力すればよいかわかりません (??? で残しました)。照会は、別のテーブルからのデータを含むオブジェクトであり、ドキュメントは XML ドキュメントです。

これに関する提案は大きな助けになります。

4

1 に答える 1

0

新しい GUID を作成する責任を、SQL Server に作成させるのではなく、リポジトリに移すことを検討してください。

リポジトリで、作業しているレコードの ID を持っているかどうか、または ID がまだ割り当てられていない新しいドキュメントであるかどうかを知っていることを願っています。

現在のドキュメントの ID がない場合は、C# を使用して新しい GUID を作成してください。ここから先は、既存のレコードを編集する場合でも、新しいレコードを作成する場合でも、コードは同じです。ID 変数を SqlCommand に (理想的にはパラメーターとして) 渡すだけです。

ステートメントでは、newId() を使用WHEN NOT MATCHEDする代わりに単に参照できます。SOURCE.Id

リポジトリで GUID を作成したので、別の操作の一部として使用する必要がある場合に値が何であるかは既にわかっています (SQL Server から返す必要はありません)。

于 2016-01-26T21:53:44.960 に答える