【问题标题】:writing Insert statement in a Stored Procedure在存储过程中编写插入语句
【发布时间】:2012-05-14 05:25:42
【问题描述】:

我有 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 个分期付款,我使用 installmentNum 列通过 winform 插入我编写了这个存储过程

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

第二个用于阅读我正在尝试编写此存储过程的选定合同的分期付款

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 的 insert 语句感到困惑 我是初学者,无法理解背后的错误,请指导我

【问题讨论】:

  • 您遇到的“错误”是什么?你遇到什么麻烦了?请更具体。
  • 好吧,一方面,您似乎在 spReadInstallment 中留下了一个挂起的事务。您有两个开始反式,但只有一个提交。我不确定你是否真的需要交易......

标签: sql winforms stored-procedures


【解决方案1】:

if @ContractID&lt;&gt;0 and @iupdate=0 //i'm confused here

您的第一个存储过程正在执行 upsert(更新或插入) - 它将根据为 PK 参数提供的参数插入或更新表:@ContractID@iupdate

当这两个都具有值0 时,存储过程将执行插入。否则,它将对表执行更新。

在此处分析您是否真的需要所有这些参数的默认值。

您的第二个存储过程,毫无疑问。像这样重写它,在 @ContractID 上没有默认值 0,并且在 SELECT 操作上没有不必要的多个挂起事务:

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

SELECT    ContractID, InstallmentNumber, currentMonth, installment, commission
FROM      Installment
WHERE     ContractID = @contractid;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-21
    • 2016-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多