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