【问题标题】:Why I am getting Column Name Missing error为什么我收到 Column Name Missing 错误
【发布时间】:2019-12-10 13:09:04
【问题描述】:

我编写了一个 SP,它将在内部调用另一个参数化 SP,并将输出存储到物理表中。当我执行外部 SP 时,我收到以下错误。

消息 207,级别 16,状态 1,过程 CBs_LargeExposer,第 88 行 [批处理 开始第 12 行] 列名“SlNo”无效。

我观察到,如果我在单独的窗口中执行内部 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

【问题讨论】:

  • 考虑#temp 可能不是一个非常独特的表名。您是否正在运行其他东西来创建不同的#temp 没有相同的列?
  • 您应该在您的程序中尝试 select * from #temp 以确保它具有 slno 列。另外,请检查您的数据库是否不区分大小写
  • 删除您的#temp 表并再次运行。定义可能不同步。

标签: sql-server tsql stored-procedures dynamic-sql


【解决方案1】:

不确定您是否已经尝试过。尝试在下面的两个 SELECT 语句中指定与 CREATE TABLE 语句中完全相同的列名“slno”,而不是“slno”。

select @LoopStart=Min(Slno) from #temp
select @loopEnd=MAX(Slno) from #temp

【讨论】:

    【解决方案2】:

    我找到了错误的解决方案。我在外部 sp 以及具有不同列的内部 sp 中创建了相同的 #temporary 表。基本上,#temporary 表的范围仅限于会话,但是当您在外部 sp 中调用内部 Sp 时,它会考虑单个会话。

    外部 SP 临时表声明

    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 它工作正常。

    【讨论】:

    • 提示:使用更有意义的名称,例如#MonthBalanceSummary。它使代码更具可读性并减少了名称冲突的机会。
    猜你喜欢
    • 2018-03-13
    • 2021-09-08
    • 1970-01-01
    • 2023-01-20
    • 2016-09-18
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多