Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 使用存储过程中的输出参数调用存储过程-列名无效_Sql Server_Stored Procedures - Fatal编程技术网

Sql server 使用存储过程中的输出参数调用存储过程-列名无效

Sql server 使用存储过程中的输出参数调用存储过程-列名无效,sql-server,stored-procedures,Sql Server,Stored Procedures,我编写了一个使用输出变量的存储过程。存储过程运行良好,我知道这是事实。我可以使用下面的代码段运行存储过程 DECLARE @return_value int, @coEfficientAlpha float EXEC @return_value = [dbo].[getTestCoEfficientAlphaByDasIdAndKeyStandard] @dasId = 4001, @keyStandardId = 960, @coEfficientAlp

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

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中调用这个过程时,我收到一个

无效的列名

错误消息。在这两个过程中我都没有做任何奇怪的事情。有什么想法吗

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

编辑:

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

好的,getTestCoefficientalphabydasis和KeyStandard的定义是

getTestReliabilityOnDasId的定义是

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

Msg 207,16级,状态1,程序GetTestCoefficientalphabydasisandKeystandard,第33行 列名“questionId”无效。 Msg 207,16级,状态1,程序GetTestCoefficientalphabydasisandKeystandard,第31行 列名“questionId”无效。 Msg 207,16级,状态1,程序GetTestCoefficientalphabydasisandKeystandard,第31行 列名“score”无效。 Msg 207,16级,状态1,程序GetTestCoefficientalphabydasisandKeystandard,第31行 列名“score”无效。 Msg 207,16级,状态1,程序GetTestCoefficientalphabydasisandKeystandard,第34行 列名“questionId”无效。 Msg 207,16级,状态1,程序GetTestCoefficientalphabydasisandKeystandard,第35行 无效的列名“dasQuestionId”。 Msg 207,16级,状态1,程序GetTestCoefficientalphabydasisandKeystandard,第27行 无效的列名“DasQuestionId”。 Msg 207,16级,状态1,程序GetTestCoefficientalphabydasisandKeystandard,第27行 列名“score”无效。 Msg 207,16级,状态1,程序GetTestCoefficientalphabydasisandKeystandard,第27行 列名“score”无效。 Msg 207,16级,状态1,程序GetTestCoefficientalphabydasisandKeystandard,第41行 列名“studentNo”无效。 Msg 207,16级,状态1,程序GetTestCoefficientalphabydasisandKeystandard,第38行 列名“studentNo”无效。 Msg 207,16级,状态1,程序GetTestCoefficientalphabydasisandKeystandard,第38行 列名“score”无效。 Msg 207,16级,状态1,程序GetTestCoefficientalphabydasisandKeystandard,第38行 列名“score”无效。 Msg 207,16级,状态1,程序GetTestCoefficientalphabydasisandKeystandard,第66行 无效的列名“dasQuestionId”。 Msg 207,16级,状态1,程序GetTestCoefficientalphabydasisandKeystandard,第66行 无效的列名“dasQuestionId”


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

您遇到了命名冲突。它们都使用SELECT。。。进入以创建名为temp的表

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

此预先存在的临时表的列名集与子过程引用的列名集完全不同,因此不会编译


如果用不同的临时表名替换其中一个过程中对temp的所有引用,则应停止看到这些编译错误。

+1。或者,内部过程可以将SELECT INTO temp替换为CREATE TABLE temp+INSERT INTO。。。选择是否必须使用特定名称。尽管这种义务可能意味着一个设计问题。@AndriyM-这仍然不能解决它。除非先编译内部进程,否则问题仍然会出现。EXEC'CREATE PROC P2 AS CREATE TABLE TY INT SELECT Y FROM T;';EXEC'CREATE PROC P1作为CREATE TABLE TX INT;执行P2';执行P1;execp2;删除进程P1,P2;。虽然如果你颠倒EXEC调用的顺序,它会独立编译该进程,然后在从父进程调用时重用缓存的计划。我相信Martin为我回答了这个问题。似乎已经处理好了。谢谢你,马丁!对不起,我对你的评论的回答是荒谬的。我的测试有点不同,因为正如我在第一篇评论中所说的,只有内部过程使用CREATETABLE,外部过程仍然使用SELECTINTO。目前,我还没有到我正在测试的实际示例的SQL Fiddle链接,但我认为您的示例的以下编辑应该大致相同,并指示我的意思:EXEC'CREATE PROC P2 AS CREATE TABLE TY INT SELECT Y FROM t;';EXEC'CREATE PROC P1 AS SELECT 1 AS X in T;执行P2';执行P1;execp2;下降过程P1,P2;它工作正常。@MartinSmith,非常感谢你,伙计!!!!!!!!!!!!!你救了我一天。如果有可能投票超过一个tim e、 我会给你至少100票。
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
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