3

我编写了一个使用输出变量的存储过程。存储过程运行良好,我知道这是事实。我可以使用下面的代码片段运行存储过程

DECLARE @return_value int,
    @coEfficientAlpha float

EXEC    @return_value = [dbo].[getTestCoEfficientAlphaByDasIdAndKeyStandard]
    @dasId = 4001,
    @keyStandardId = 960,
    @coEfficientAlpha = @coEfficientAlpha OUTPUT

SELECT  @coEfficientAlpha as N'@coEfficientAlpha'

SELECT  'Return Value' = @return_value

GO

但是当我从我的其他存储过程中调用这个过程时getTestReliabilityOnDasId,我收到一个

列名无效

错误信息。我在这两个程序中都没有做任何奇怪的事情。有任何想法吗?

如果需要,我会发布更多代码。

编辑:

我的 2 个存储过程的代码如下:

好的,定义getTestCoEfficientAlphaByDasIdAndKeyStandard

ALTER procedure [dbo].[getTestCoEfficientAlphaByDasIdAndKeyStandard]
@dasId int,
@keyStandardId int,
@coEfficientAlpha float output
as

--declare @dasId int
--set @dasId = 4001

--declare @keyStandardId int
--set @keyStandardId = 960

-- used all over query
select qa.*, dq.dasQuestionId
into #temp
from test t 
    inner join question q on t.testId = q.testId
    inner join questionAnswer qa on q.questionId = qa.questionId
    inner join dasQuestion dq on t.dasId = dq.dasId and q.questionNumber = dq.questionNumber
    inner join keyStandardDasQuestion ksdq on dq.dasQuestionId = ksdq.dasQuestionId
where t.dasId = @dasId
    and q.questionTypeId = 2
    and ksdq.keyStandardId = @keyStandardId


-- used later in query
select tb1.DasQuestionId, sum(square(tb1.score - tb2.avgScore))/count(tb1.score) as qSd2
into #questions
from #temp tb1
    inner join (
        select questionId, sum(score)/cast(count(score) as float) as avgScore
        from #temp
        group by questionId
    )tb2 on tb1.questionId = tb2.questionId
group by tb1.dasQuestionId

-- used later in query
select studentNo, sum(score) as studentTestScore, count(score) as cntTestScore
into #testData
from #temp
group by studentNo

-- average number of questions correct on test          
declare @avgTScore float
set @avgTScore = (  
    select sum(studentTestScore) / cast(count(studentTestScore) as float) from     #testData    
    )   

-- average variance of questions right on test
declare @tSd2 float
set @tSd2 = (
        select sum(xMinusMean)/count(xMinusMean) as tSd2
        from (
            select (t.studentTestScore - @avgTScore)*(t.studentTestScore - @avgTScore) as xMinusMean
        from #testData t
        )tb1 

    )

set @coEfficientAlpha = (
    select (count(distinct dasQuestionId)/ (cast(count(distinct dasQuestionId) as     float) - 1))*(1-((select sum(qSd2) from #questions)/@tSd2)) as coEfficientAlpha
    from #temp
)

drop table #temp, #questions , #testdata

的定义getTestReliabilityOnDasId

ALTER procedure [dbo].[getTestReliabilityOnDasId]
@dasId int
as


--declare @dasId int
--set @dasId = 4001

select ROW_NUMBER() OVER(order by ks.keyStandardId asc) AS rowNumber,
    da.dasId, da.title, ks.keyStandardId, ks.keyStandardText, count(dq.dasQuestionId)     as countQuestions
into #temp
from districtAssessment da
    inner join dasQuestion dq on da.dasId = dq.dasId
    inner join keyStandardDasQuestion ksdq on dq.dasQuestionId = ksdq.dasQuestionId
    inner join keyStandard ks on ksdq.keyStandardId = ks.keyStandardId
where da.dasId = @dasId
group by da.dasId, da.title, ks.keyStandardId, ks.keyStandardText


create table #KeyStandards(
    [keyStandardId] int,
    coEfficientAlpha float
)

declare @numRows int
select @numRows = max(rowNumber)
from #temp

declare @keyStandardId int, @rowNumber int
set @rowNumber = 1

DECLARE @return_value int,
        @coEfficientAlpha float,
        @numQuestions int

WHILE @rowNumber <= @numRows
BEGIN
    set @keyStandardId = (
   select keyStandardId
   from #temp
   where rowNumber = @rowNumber )

    set @numQuestions = (select countQuestions from #temp where keyStandardId = @keyStandardId   )

    if @numQuestions > 1
    begin
        EXEC    @return_value = [dbo].    [getTestCoEfficientAlphaByDasIdAndKeyStandard]
                @dasId = @dasId,
                @keyStandardId = @keyStandardId,
            @coEfficientAlpha = @coEfficientAlpha OUTPUT

    end

   insert into #keyStandards
   select @keyStandardId, case when @coEfficientAlpha is null then 'Not Enough     Questions' else @coEfficientAlpha end 

   set @rowNumber = @rowNumber + 1
END

select t.*, k.coEfficientAlpha
from #temp t
    inner join #keyStandards k on t.keyStandardId = k.keyStandardId

drop table #temp, #KeyStandards

我得到的确切错误消息是:

消息 207,级别 16,状态 1,过程 getTestCoEfficientAlphaByDasIdAndKeyStandard,第 33 行
无效的列名称“questionId”。
消息 207,级别 16,状态 1,过程 getTestCoEfficientAlphaByDasIdAndKeyStandard,第 31 行
无效的列名称“questionId”。
消息 207,级别 16,状态 1,过程 getTestCoEfficientAlphaByDasIdAndKeyStandard,第 31 行
无效的列名称“分数”。
消息 207,级别 16,状态 1,过程 getTestCoEfficientAlphaByDasIdAndKeyStandard,第 31 行
无效的列名称“分数”。
消息 207,级别 16,状态 1,过程 getTestCoEfficientAlphaByDasIdAndKeyStandard,第 34 行
无效的列名称“questionId”。
消息 207,级别 16,状态 1,过程 getTestCoEfficientAlphaByDasIdAndKeyStandard,第 35 行
无效列名称“dasQuestionId”。
消息 207,级别 16,状态 1,过程 getTestCoEfficientAlphaByDasIdAndKeyStandard,第 27 行
无效的列名称“DasQuestionId”。
消息 207,级别 16,状态 1,过程 getTestCoEfficientAlphaByDasIdAndKeyStandard,第 27 行
无效的列名称“分数”。
消息 207,级别 16,状态 1,过程 getTestCoEfficientAlphaByDasIdAndKeyStandard,第 27 行
无效的列名称“分数”。
消息 207,级别 16,状态 1,过程 getTestCoEfficientAlphaByDasIdAndKeyStandard,第 41 行
无效的列名称“studentNo”。
消息 207,级别 16,状态 1,过程 getTestCoEfficientAlphaByDasIdAndKeyStandard,第 38 行
无效的列名称“studentNo”。
消息 207,级别 16,状态 1,过程 getTestCoEfficientAlphaByDasIdAndKeyStandard,第 38 行
无效的列名称“分数”。
消息 207,级别 16,状态 1,过程 getTestCoEfficientAlphaByDasIdAndKeyStandard,第 38 行
无效的列名称“分数”。
消息 207,级别 16,状态 1,过程 getTestCoEfficientAlphaByDasIdAndKeyStandard,第 66 行
无效列名称“dasQuestionId”。
消息 207,级别 16,状态 1,过程 getTestCoEfficientAlphaByDasIdAndKeyStandard,第 66 行
无效列名称“dasQuestionId”。

注意:如果我运行,getTestReliabilityOnDasId我会收到这些错误消息。如果我运行getTestCoEfficientAlphaByDasIdAndKeyStandard然后getTestReliabilityOnDasId在单独的查询窗口中运行,那么一切运行正常。这几乎就像 SQL Server 引擎必须预热或其他东西......

4

1 回答 1

4

你有一个命名冲突。它们都SELECT ... INTO用于创建一个名为#temp.

当一个存储过程调用另一个存储过程时,嵌套存储过程可以看到父级的临时表。

这个预先存在的#temp表将具有与子过程引用的完全不同的一组列名,并且它不会编译。

如果您用#temp不同的临时表名称替换其中一个过程中对的所有引用,那么您应该不会再看到这些编译错误。

于 2013-04-01T20:20:19.887 回答