为什么我收到 Column Name Missing 错误
Why I am getting Column Name Missing error
我写了一个 SP,它将在内部调用另一个参数化 SP,输出将存储到物理 table.While我正在执行外部 SP,我收到以下错误。
Msg 207, Level 16, State 1, Procedure CBs_LargeExposer, Line 88 [Batch
Start Line 12] Invalid column name 'SlNo'.
我观察到,如果我在单独的 window 中执行内部 SP,如果我执行相同的外部 SP 就在它旁边执行,则在一定时间后如果我执行相同的语句(外部 SP)我我得到同样的错误。
ALTER PROCEDURE [dbo].[CBS_GlMapping]
@finYear nvarchar(30)='2019-2020',
@quarter char(5)='Q2',
@Oflag Varchar(6)='O4'
AS
BEGIN
SET NOCOUNT ON;
Declare @QtrStart date,@QtrSEnd date,@FyFrom int,@FyTo int,@BranchId int
select @FyFrom=year(YearBeginDate),@FyTo=Year(YEarEndDate) from BranchTable where BranchCode in(select OrgBankCode from OrgDetails)
IF(@FyFrom < left(@finYear,4) and @FyTo < Right(@finYear,4))
Begin
print 'Sorry, Recods are not available for the financial year ' + @finYear
return
End
If(@quarter='Q1')
Begin
select @QtrStart=YearBeginDate,@QtrSEnd=EOMONTH(DATEADD(MM,2,YearBeginDate)) from BranchTable where BranchCode in(select OrgBankCode from OrgDetails)
End
If(@quarter='Q2')
Begin
select @QtrStart=Dateadd(mm,3,YearBeginDate),@QtrSEnd=EOMONTH(DATEADD(MM,5,YearBeginDate)) from BranchTable where BranchCode in(select OrgBankCode from OrgDetails)
End
If(@quarter='Q3')
Begin
select @QtrStart=Dateadd(mm,6,YearBeginDate),@QtrSEnd=EOMONTH(DATEADD(MM,8,YearBeginDate)) from BranchTable where BranchCode in(select OrgBankCode from OrgDetails)
End
If(@quarter='Q4')
Begin
select @QtrStart=DATEADD(month, DATEDIFF(month, 0,Dateadd(mm,-2,YEarEndDate)), 0),@QtrSEnd=YEarEndDate from BranchTable where BranchCode in(select OrgBankCode from OrgDetails)
End
/* To handel the Financial year */
if(left(@finYear,4)<year(@QtrStart) and @quarter<>'Q4')
begin
set @QtrStart = cast(left(@finYear,4) as varchar(4))+'-'+cast(month(@QtrStart) as Varchar(2))+'-'+Cast(day(@QtrStart) as Varchar(2))
set @QtrSEnd = cast(left(@finYear,4) as varchar(4))+'-'+cast(month(@QtrSEnd) as Varchar(2))+'-'+Cast(day(@QtrSEnd) as Varchar(2))
end
if(right(@finYear,4)<year(@QtrStart) and @quarter='Q4')
begin
set @QtrStart = cast(right(@finYear,4) as varchar(4))+'-'+cast(month(@QtrStart) as Varchar(2))+'-'+Cast(day(@QtrStart) as Varchar(2))
set @QtrSEnd = cast(right(@finYear,4) as varchar(4))+'-'+cast(month(@QtrSEnd) as Varchar(2))+'-'+Cast(day(@QtrSEnd) as Varchar(2))
end
Create table #tempData
(
Bal numeric(15,2)
)
declare @sql varchar(500),@sql2 varchar(500),@day Varchar(10),@Month varchar(2),@Year varchar(4)
select @day= Day(@QtrSEnd)
select @Month= month(@QtrSEnd)
select @Year= Year(@QtrSEnd)
Create table #temp
( slno int,
glcode Varchar(500),
GlLen int,
ColNO varchar(50),
CellNo varchar(50),
Amount Numeric(15,2)
)
declare @tsql varchar(500)
set @tsql=N'
insert into #temp
select ROW_NUMBER() over(order by glcode) slno,glcode,LEN(Glcode) GlLen,ColNo,CellNo,amount
from BsGl'+@Oflag+'
where glcode <>'''' '
exec(@tsql)
declare @LoopStart int,@loopEnd Int,@glcode varchar(500),@amt numeric(15,0)
select @LoopStart=Min(Slno) from #temp
select @loopEnd=MAX(Slno) from #temp
while (@LoopStart <= @loopEnd)
begin
select @glcode= Glcode from #temp where slno = @LoopStart
set @sql='insert into #tempData select Sum(day'+@day+') from DayBal where AcYear='+@Year+' and acmonth='+@Month+'and GlCode in(SELECT glcode FROM dbo.splitstring(convert(varchar(500),'''+@glcode+''')))'
EXEC(@sql)
update #temp set Amount=(select Bal from #tempData) where slno =@LoopStart
set @LoopStart=@LoopStart+1
Truncate table #tempData
end
set @tsql=''
set @tsql='update BsGl'+@Oflag+' set Amount=0.00 where Glcode ='''' '
EXEC(@tsql)
set @tsql=''
set @tsql='update B set B.amount=isnull(round((Case when A.Amount<0 then A.Amount*(-1) else A.Amount end/1000),0),0) from #temp a inner join BsGl'+@Oflag+' B on a.CellNo=B.CellNo and B.ColNo=A.ColNo'
EXEC(@tsql)
IF(@Oflag='O4')
BEGIN
EXEC [DBO].[CBs_LargeExposer] @QtrSEnd
END
Drop table #temp
End
不确定您是否已经尝试过。尝试在下面的两个 SELECT 语句中指定与 CREATE TABLE 语句中完全相同的列名 "slno",而不是 "Slno".
select @LoopStart=Min(Slno) from #temp
select @loopEnd=MAX(Slno) from #temp
我找到了错误的解决方案。我在外部 sp 以及具有不同列的内部 sp 中创建了相同的#temporary table。基本上,#temporary table 的范围仅限于会话,但是当您在外部 sp 中调用内部 Sp 时,它将考虑单个会话。
外部 SP TempTable 声明
Create table #tempData
(
Bal numeric(15,2)
)
内部 SP TempTable 声明
CREATE TABLE #tempData(
[ID] int identity(1,1) ,
[Funded] [numeric](15, 2) NOT NULL,
[NonFunded] [numeric](2, 2) NOT NULL,
[Limitsanctioned] [numeric](15, 2) NOT NULL
)
所以我将外部 Sp 中的#tmpData 更改为#tempData1,它工作正常。
我写了一个 SP,它将在内部调用另一个参数化 SP,输出将存储到物理 table.While我正在执行外部 SP,我收到以下错误。
Msg 207, Level 16, State 1, Procedure CBs_LargeExposer, Line 88 [Batch Start Line 12] Invalid column name 'SlNo'.
我观察到,如果我在单独的 window 中执行内部 SP,如果我执行相同的外部 SP 就在它旁边执行,则在一定时间后如果我执行相同的语句(外部 SP)我我得到同样的错误。
ALTER PROCEDURE [dbo].[CBS_GlMapping]
@finYear nvarchar(30)='2019-2020',
@quarter char(5)='Q2',
@Oflag Varchar(6)='O4'
AS
BEGIN
SET NOCOUNT ON;
Declare @QtrStart date,@QtrSEnd date,@FyFrom int,@FyTo int,@BranchId int
select @FyFrom=year(YearBeginDate),@FyTo=Year(YEarEndDate) from BranchTable where BranchCode in(select OrgBankCode from OrgDetails)
IF(@FyFrom < left(@finYear,4) and @FyTo < Right(@finYear,4))
Begin
print 'Sorry, Recods are not available for the financial year ' + @finYear
return
End
If(@quarter='Q1')
Begin
select @QtrStart=YearBeginDate,@QtrSEnd=EOMONTH(DATEADD(MM,2,YearBeginDate)) from BranchTable where BranchCode in(select OrgBankCode from OrgDetails)
End
If(@quarter='Q2')
Begin
select @QtrStart=Dateadd(mm,3,YearBeginDate),@QtrSEnd=EOMONTH(DATEADD(MM,5,YearBeginDate)) from BranchTable where BranchCode in(select OrgBankCode from OrgDetails)
End
If(@quarter='Q3')
Begin
select @QtrStart=Dateadd(mm,6,YearBeginDate),@QtrSEnd=EOMONTH(DATEADD(MM,8,YearBeginDate)) from BranchTable where BranchCode in(select OrgBankCode from OrgDetails)
End
If(@quarter='Q4')
Begin
select @QtrStart=DATEADD(month, DATEDIFF(month, 0,Dateadd(mm,-2,YEarEndDate)), 0),@QtrSEnd=YEarEndDate from BranchTable where BranchCode in(select OrgBankCode from OrgDetails)
End
/* To handel the Financial year */
if(left(@finYear,4)<year(@QtrStart) and @quarter<>'Q4')
begin
set @QtrStart = cast(left(@finYear,4) as varchar(4))+'-'+cast(month(@QtrStart) as Varchar(2))+'-'+Cast(day(@QtrStart) as Varchar(2))
set @QtrSEnd = cast(left(@finYear,4) as varchar(4))+'-'+cast(month(@QtrSEnd) as Varchar(2))+'-'+Cast(day(@QtrSEnd) as Varchar(2))
end
if(right(@finYear,4)<year(@QtrStart) and @quarter='Q4')
begin
set @QtrStart = cast(right(@finYear,4) as varchar(4))+'-'+cast(month(@QtrStart) as Varchar(2))+'-'+Cast(day(@QtrStart) as Varchar(2))
set @QtrSEnd = cast(right(@finYear,4) as varchar(4))+'-'+cast(month(@QtrSEnd) as Varchar(2))+'-'+Cast(day(@QtrSEnd) as Varchar(2))
end
Create table #tempData
(
Bal numeric(15,2)
)
declare @sql varchar(500),@sql2 varchar(500),@day Varchar(10),@Month varchar(2),@Year varchar(4)
select @day= Day(@QtrSEnd)
select @Month= month(@QtrSEnd)
select @Year= Year(@QtrSEnd)
Create table #temp
( slno int,
glcode Varchar(500),
GlLen int,
ColNO varchar(50),
CellNo varchar(50),
Amount Numeric(15,2)
)
declare @tsql varchar(500)
set @tsql=N'
insert into #temp
select ROW_NUMBER() over(order by glcode) slno,glcode,LEN(Glcode) GlLen,ColNo,CellNo,amount
from BsGl'+@Oflag+'
where glcode <>'''' '
exec(@tsql)
declare @LoopStart int,@loopEnd Int,@glcode varchar(500),@amt numeric(15,0)
select @LoopStart=Min(Slno) from #temp
select @loopEnd=MAX(Slno) from #temp
while (@LoopStart <= @loopEnd)
begin
select @glcode= Glcode from #temp where slno = @LoopStart
set @sql='insert into #tempData select Sum(day'+@day+') from DayBal where AcYear='+@Year+' and acmonth='+@Month+'and GlCode in(SELECT glcode FROM dbo.splitstring(convert(varchar(500),'''+@glcode+''')))'
EXEC(@sql)
update #temp set Amount=(select Bal from #tempData) where slno =@LoopStart
set @LoopStart=@LoopStart+1
Truncate table #tempData
end
set @tsql=''
set @tsql='update BsGl'+@Oflag+' set Amount=0.00 where Glcode ='''' '
EXEC(@tsql)
set @tsql=''
set @tsql='update B set B.amount=isnull(round((Case when A.Amount<0 then A.Amount*(-1) else A.Amount end/1000),0),0) from #temp a inner join BsGl'+@Oflag+' B on a.CellNo=B.CellNo and B.ColNo=A.ColNo'
EXEC(@tsql)
IF(@Oflag='O4')
BEGIN
EXEC [DBO].[CBs_LargeExposer] @QtrSEnd
END
Drop table #temp
End
不确定您是否已经尝试过。尝试在下面的两个 SELECT 语句中指定与 CREATE TABLE 语句中完全相同的列名 "slno",而不是 "Slno".
select @LoopStart=Min(Slno) from #temp
select @loopEnd=MAX(Slno) from #temp
我找到了错误的解决方案。我在外部 sp 以及具有不同列的内部 sp 中创建了相同的#temporary table。基本上,#temporary table 的范围仅限于会话,但是当您在外部 sp 中调用内部 Sp 时,它将考虑单个会话。
外部 SP TempTable 声明
Create table #tempData
(
Bal numeric(15,2)
)
内部 SP TempTable 声明
CREATE TABLE #tempData(
[ID] int identity(1,1) ,
[Funded] [numeric](15, 2) NOT NULL,
[NonFunded] [numeric](2, 2) NOT NULL,
[Limitsanctioned] [numeric](15, 2) NOT NULL
)
所以我将外部 Sp 中的#tmpData 更改为#tempData1,它工作正常。