0

2つのSQLテーブルがあります

[dbo].[Contract]
[ContractID] pk,.....other column

[dbo].[Installment] //this table has composite primary key
[ContractID] pk n fk // it is primary and foreign key
[installmentNum] pk, // contractID and installmentnum both are the primary keys

ContractIDには、これに対して6つまたは12の分割払いがあります。winformを介して挿入するためにinstallmentNum列を使用しました。このストアドプロシージャを記述します。

ALTER PROCEDURE [dbo].[spInsertUpdateInstallment]
@ContractID int = 0,
@InstallmentNumber int = 0,
@month varchar(10),
@installment money = 0.00,
@commission money = 0.00,
@iupdate int = 0
AS
SET NOCOUNT ON 
SET XACT_ABORT ON  
BEGIN TRAN
 if @ContractID<>0 and @iupdate=0 //i'm confused here
BEGIN
INSERT INTO [dbo].[Installment] 
VALUES(@InstallmentNumber,@month,@installment,@commission)
END
if @ContractID <>0 and @month is not null and @iupdate=1
BEGIN
UPDATE [dbo].[Installment] 
SET 
[ContractID] = @ContractID,
[InstallmentNumber] = @InstallmentNumber,
[currentMonth] = @month,
[installment] = @installment,
[commission] = @commission
WHERE [ContractID] = @ContractID and [currentMonth] = @month
END
Commit

選択した契約の1つずつ分割払いを読むための2番目私はこのストアドプロシージャを書き込もうとしています

ALTER PROCEDURE [dbo].[spReadInstallment]
@ContractID int = 0
AS
SET NOCOUNT ON 
SET XACT_ABORT ON
BEGIN tran
if @ContractID<>0
begin tran
BEGIN
SELECT     ContractID, InstallmentNumber, currentMonth, installment, commission
FROM         Installment
WHERE     (ContractID = @contractid) // have doubt about the select statement?
END
commit

spReadInstallmentのSELECTステートメントとspInsertUpdateInstallmentの挿入ステートメントについて混乱しています私は初心者で、背後にある間違いを理解できません親切に案内してください

4

1 に答える 1

1

if @ContractID<>0 and @iupdate=0 //i'm confused here

最初のストアド プロシージャはアップサート(更新または挿入) を実行しています。PK パラメータに指定された引数に応じて、テーブルを挿入または更新します @ContractID@iupdate

これら 2 つが両方とも value0の場合、ストアド プロシージャは挿入を実行します。それ以外の場合は、テーブルの更新が実行されます。

ここで、パラメーターのすべてのデフォルト値が本当に必要かどうかを分析してください。

2 番目のストアド プロシージャです。疑いの余地はありません。0のデフォルト値を使用@ContractIDせずに、また SELECT 操作で不要な複数のハング トランザクションを使用せずに、次のように書き換えます。

ALTER PROCEDURE [dbo].[spReadInstallment]
@ContractID int
AS
SET NOCOUNT ON;

SELECT    ContractID, InstallmentNumber, currentMonth, installment, commission
FROM      Installment
WHERE     ContractID = @contractid;
于 2012-05-04T16:33:54.833 に答える