Sql server INSERT语句的select列表包含的项目多于INSERT列表
这个存储过程有问题。我已经研究过几次了,所以我猜我只是错过了一些明显的东西。如果我尝试并实际删除选择列表的任何部分,那么SSMS会给出相同的错误。如果让它们相等,那么VS debug会给出错误。我对这个有点困惑。大部分程序如下:Sql server INSERT语句的select列表包含的项目多于INSERT列表,sql-server,tsql,stored-procedures,Sql Server,Tsql,Stored Procedures,这个存储过程有问题。我已经研究过几次了,所以我猜我只是错过了一些明显的东西。如果我尝试并实际删除选择列表的任何部分,那么SSMS会给出相同的错误。如果让它们相等,那么VS debug会给出错误。我对这个有点困惑。大部分程序如下: ALTER PROCEDURE [dbo].[Billing_Misc_Update_Test] ( @ID as varchar(100), @CandidateID as varchar(100), @EntryType as varchar(100), @Amo
ALTER PROCEDURE [dbo].[Billing_Misc_Update_Test]
(
@ID as varchar(100), @CandidateID as varchar(100), @EntryType as varchar(100), @Amount as money, @EntryDate as smalldatetime, @InvoiceBillingDate as smalldatetime, @ClientKey as varchar(100), @BillingMemo as varchar(100), @UserID as varchar(100), @RegBilled as varchar(100), @OTBilled as varchar(100), @RegPaid as varchar(100), @OTPaid as varchar(100), @chkStatus as varchar(25) )
-- This is an insert
if @ID = 0
Begin
If not exists (select 1 from AccoutingReports with (nolock)
where Verify = @CandidateID
and BillingDate = @EntryDate
and InvoiceBillingDate = @InvoiceBillingDate
and BillingMiscType = @BillingMiscType
)
Begin
if @EntryType = 'Expense' or @EntryType = 'Bonus' or @EntryType = 'other'
Begin
Insert into AccoutingReports (
[BillingDate],
[ConsultantName],
[HoursWorked],
[OTHoursWork],
[HoursBilled],
[RegHoursBilled],
[OTHoursBilled],
[PayDollars],
[BilledDollars],
[RegBilledDollars],
[NegBilledDollars],
[OTBilledDollars],
[NegOTBilled_Dollars],
[MedicalCost],
[FicsSutaSS],
[PerDiem],
[PerDiemPay],
[COGS],
[GrossProfit],
[GrossMargin],
[CommissionPercent],
[CommissionSales],
[CommissionRecruiter],
[Verify],
[BurdenPercent],
[ClientKey],
[W1],
[W2],
[EarnedDays],
[VacationDays],
[Memo],
[TSDate],
[isImported],
[BillingMiscType],
[BillingMiscMemo],
[InvoiceBillingDate],
[InvoiceStatus])
Select
@EntryDate,
'Updated By UserID: ' + @UserID,
0,
0,
0,
0,
0,
@amount,
@amount,
@amount,
@amount,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
@CandidateID,
0,
@ClientKey,
0,
0,
0,
0,
@BillingMemo,
getdate(),
0,
@BillingMiscType,
@BillingMemo,
@InvoiceBillingDate,
@chkStatus
End Else
Begin
Insert into AccoutingReports (
[BillingDate],
[ConsultantName],
[HoursWorked],
[OTHoursWork],
[HoursBilled],
[RegHoursBilled],
[OTHoursBilled],
[PayDollars],
[BilledDollars],
[RegBilledDollars],
[NegBilledDollars],
[OTBilledDollars],
[NegOTBilled_Dollars],
[MedicalCost],
[FicsSutaSS],
[PerDiem],
[PerDiemPay],
[COGS],
[GrossProfit],
[GrossMargin],
[CommissionPercent],
[CommissionSales],
[CommissionRecruiter],
[Verify],
[BurdenPercent],
[ClientKey],
[W1],
[W2],
[EarnedDays],
[VacationDays],
[Memo],
[TSDate],
[isImported],
[BillingMiscType],
[BillingMiscMemo],
[InvoiceBillingDate],
[InvoiceStatus])
Select @EntryDate,
'Updated By UserID: ' + @UserID,
convert(money, @RegPaid) + convert(money, @OTPaid),
@OTPaid,
convert(money, @RegBilled) + convert(money, @OTBilled),
@RegBilled,
@OTBilled,
(convert(money, @RegPaid) * @payrate) + (convert(money, @OTPaid) + @PayRate),
(convert(money, @RegBilled) * @BillRate) + (convert(money, @OTBilled) + @BillRate),
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
@CandidateID,
0,
@ClientKey,
0,
0,
0,
0,
@BillingMemo,
getdate(),
0,
@BillingMiscType,
@BillingMemo,
@InvoiceBillingDate,
@chkStatus
End
Select RowsUpdated = @@Rowcount, Error = 'New Entry: Transaction Successfull'
End Else
Begin
Select RowsUpdated = 0, Error = 'Entry Already Exists'
End
End Else
Begin
If not exists (select 1 from AccoutingReports with (nolock)
where Verify = @CandidateID
and BillingDate = @EntryDate
and InvoiceBillingDate = @InvoiceBillingDate
and BillingMiscType = @BillingMiscType
and ID <> @ID
)
Begin
if @EntryType = 'Expense' or @EntryType = 'Bonus' or @EntryType = 'other'
Begin
Update AccoutingReports
Set [BillingDate] = @EntryDate
, [ConsultantName] = 'Updated By UserID: ' + @UserID
, [HoursWorked] = 0
, [OTHoursWork] = 0
, [HoursBilled] = 0
, [RegHoursBilled] = 0
, [OTHoursBilled] = 0
, [PayDollars] = @amount
, [BilledDollars] = @amount
, [RegBilledDollars] = @amount
, [NegBilledDollars] = @amount
, BillingMiscType = @BillingMiscType
, BillingMiscMemo = @BillingMemo
, InvoiceBillingDate = @InvoiceBillingDate
, InvoiceStatus = @chkStatus
where ID = @ID
End Else
Begin
Update AccoutingReports
Set [BillingDate] = @EntryDate
, [ConsultantName] = 'Updated By UserID: ' + @UserID
, [HoursWorked] = convert(money, @RegPaid) + convert(money, @OTPaid)
, [OTHoursWork] = @OTPaid
, [HoursBilled] = convert(money, @RegBilled) + convert(money, @OTBilled)
, [RegHoursBilled] = @RegBilled
, [OTHoursBilled] = @OTBilled
, [PayDollars] = (convert(money, @RegPaid) * @payrate) + (convert(money, @OTPaid) + @PayRate)
, [BilledDollars] = (convert(money, @RegBilled) * @BillRate) + (convert(money, @OTBilled) + @BillRate)
, [RegBilledDollars] = 0
, [NegBilledDollars] = 0
, BillingMiscType = @BillingMiscType
, BillingMiscMemo = @BillingMemo
, InvoiceBillingDate = @InvoiceBillingDate
, InvoiceStatus = @chkStatus
where ID = @ID
End
Select RowsUpdated = @@Rowcount, Error = 'Update Entry: Transaction Successfull'
End Else
Begin
Select RowsUpdated = 0, Error = 'Entry Already Exists'
End
End
ID的结果通常为0,我开始使用的EntryType是Bonus。因此,它应该运行insert/select语句的第一个块,但会给出一个错误
值得注意的是,我所做的更改是向AccountingReports表添加一个新列InvoiceStatus,以将chkStatus存储为varchar25。在将这个新列添加到表中并修改insert/select语句之后,它给了我这个错误。我很迷路,所以任何建议都会有帮助,谢谢 我最后在数据库中创建了另一个表,以及第二个insert/select语句,该语句将放置相同的ID+候选ID,然后是带参数的筛选chkstatus列。我不知道为什么最初的解决方案不起作用,但这是一个相当简单的解决方案,不应该从理想的解决方案中拿走太多东西。干杯 我看到的唯一问题是,在你的程序参数之后,你需要一个AS BEGIN。。。SP勇气。。。这里只有两条insert语句。将它们与您的过程分开,并单独运行它们。一些像样的格式将使调试变得容易得多。当您将包含大量列的insert语句塞进两行时,调试和支持会更加困难。@Dave.Gugg语法应该准确,因为我只是在修改一个以前工作正常的SP。我只是想让它符合Stack Overflow的灰色编码框要求。@SeanLange它应该只运行第一个。我已经对它进行了详细介绍,事实上,在添加InvoiceStatus列之前,它运行良好,这让我相信它存在一些宏级别的错误,而不一定是逗号或小语法问题。不管怎样,我已经听从了你的建议,并且可以相应地对其进行编辑。@Dave.Gugg@BillingMiscType和@payrate也未声明。SQL Server不分析此代码。