January 30, 2013 at 8:53 am
I'm getting this error message when calling a stored procedure. I want to get back two values from the procedure, and this seemed a slicker way than creating a two-column temp table, or table variable. However, I can't get it to work, and nothing I've found on the net has been of any help.
The message seems unclear right off - how can a parameter 'request' something? And as far as I can see, I have all the proper places tagged with the keyword OUTPUT, and I don't have it on the parameter in question, which, in fact is only an input parameter - I don't put anything into it during the procedure and I don't use it for anything subsequently. But when I attempt to use the outer procedure, like this:
EXEC@return_value = [KompletFiltr].[spSousediciAkcesity]
@akcesAutoID = 43023,
@LtrFiltr = N'''E'''
I get this error and no clue what I'm doing wrong.
The first procedure calles the second procedure. They all compile fine, and all this was working until I tried using OUTPUT parameters.
ALTER PROCEDURE [NoFiltr].[spSousediciAkcesity]
-- AkcesAutoID of current record, other parameters from RychlyFiltr formulas
@AkcesAutoID INT,
@LtrFiltr varchar(100) = '',
@Skip1E char(1) = ''
WITH recompile, EXECUTE AS OWNER
AS
BEGIN
SET NOCOUNT ON
declare @CompleteQuery nvarchar(4000)
DECLARE @Rok INT
DECLARE @AkcesitPred VARCHAR(2)
DECLARE @Akcesit INT
DECLARE @AkcN INT
DECLARE @AkcP INT
-- Výsledek hledání hodíme do dočasné tabulky.
create TABLE #tbl (AkcesAutoID INT, Rok int, AkcesitPred VARCHAR(2), Akcesit INT)
-- Sestavíme dotaz
set @CompleteQuery = QConstant.CompleteSousediciAkcesityQuery(QConstant.FieldsClause(0) + QConstant.JoinClause(@LtrFiltr))
-- Spustíme dotaz
EXEC sp_executeSQL @CompleteQuery,
N'@AkcesAutoID int, @LtrFiltr varchar(100)',
@AkcesAutoID, @LtrFiltr
-- Vyhledámě předchozí a následující Akcesity, který obsahují podrobné záznamy splňující podmínky
set @AkcN = 0
set @AkcP = 0
exec QConstant.SousediciAkcesity @AkcesAutoID, @AkcN Output, @AkcP Output
-- Tady hodíme dvě AkcesAutoID čísla do výsledku a jsme hotový.
SELECT @AkcN APodNext, @AkcP APodPrev
alter procedure QConstant.SousediciAkcesity
@SA_AkcesAutoID int,
@SA_AkcN INT OUTPUT, @SA_AkcP INT OUTPUT
AS
BEGIN
SET NOCOUNT ON
DECLARE @Rok INT
DECLARE @AkcesitPred VARCHAR(2)
DECLARE @Akcesit INT
SELECT @Rok = Rok, @AkcesitPred = AkcesitPred, @Akcesit = Akcesit FROM Akces WHERE AkcesAutoID = @SA_AkcesAutoID
-- Z dočasné tabulky pak vybereme dvé čísla, příští a předchozí, který splňují filtrovací podmínky, takto:
-- V obou směrech:Hledat stejný Rok a AkcesitPred, příští Akcesit číslo.
--Když není, hledat stejný Rok a příští AkcesitPred, první Akcesit číslo
--Když není, hledat příští Rok, první AkcesitPred a Akcesit číslo
--Když není, vrátit Null.
-- Řazení se postará o pořadí, TOP 1 najde příští, větší nebo menší.
IF exists (SELECT null FROM #tbl WHERE Rok = @Rok AND AkcesitPred = @AkcesitPred AND Akcesit > @Akcesit)
SET@SA_AkcN = (SELECT top 1 AkcesAutoID FROM #tbl WHERE Rok = @Rok AND AkcesitPred = @AkcesitPred AND Akcesit > @Akcesit ORDER BY Akcesit)
ELSE
IF exists (SELECT null FROM #tbl WHERE Rok = @Rok AND AkcesitPred > @AkcesitPred)
SET@SA_AkcN = (SELECT TOP 1 AkcesAutoID FROM #tbl WHERE Rok = @Rok AND AkcesitPred > @AkcesitPred ORDER BY AkcesitPred, Akcesit)
ELSE
IF exists (SELECT null FROM #tbl WHERE Rok > @Rok)
SET@SA_AkcN = (SELECT TOP 1 AkcesAutoID FROM #tbl WHERE Rok > @Rok ORDER BY Rok, AkcesitPred, Akcesit)
ELSE
SET@SA_AkcN = (SELECT NULL)
IF exists (SELECT null FROM #tbl WHERE Rok = @Rok AND AkcesitPred = @AkcesitPred AND Akcesit < @Akcesit)
SET@SA_AkcP = (SELECT TOP 1 AkcesAutoID FROM #tbl WHERE Rok = @Rok AND AkcesitPred = @AkcesitPred AND Akcesit < @Akcesit ORDER BY Akcesit DESC)
ELSE
IF exists (SELECT null FROM #tbl WHERE Rok = @Rok AND AkcesitPred < @AkcesitPred)
SET@SA_AkcP = (SELECT TOP 1 AkcesAutoID FROM #tbl WHERE Rok = @Rok AND AkcesitPred < @AkcesitPred ORDER BY AkcesitPred DESC, Akcesit DESC)
ELSE
IF exists (SELECT null FROM #tbl WHERE Rok < @Rok)
SET@SA_AkcP = (SELECT TOP 1 AkcesAutoID FROM #tbl WHERE Rok < @Rok ORDER BY Rok DESC, AkcesitPred DESC, Akcesit DESC)
ELSE
SET@SA_AkcP = (SELECT NULL)
END
January 30, 2013 at 9:11 am
It's kind of hard to follow what's going on precisely...because of the different schemas, the language (former yugoslavian something!), and all the "noise" i.e. code not related to the actual stored procedure call.
Hence I wonder if you've tried simplifying the thing i.e. doing your procedure call in isolation. (Because to me too it looks OK.)
Indeed, I wonder if you are not calling the same stored procedure somewhere else in your code (but without the proper OUTPUT declaration) for example in the dynamic sql bit below?
EXEC sp_executeSQL @CompleteQuery,
N'@AkcesAutoID int, @LtrFiltr varchar(100)',
@AkcesAutoID, @LtrFiltr
But I would suggest isolating the code which you believe is causing you a problem, without all the other code, and even reposting with a briefer version of your code without all the unnecessary stuff.
Hope this helps.
January 30, 2013 at 9:22 am
Argh, never mind. Your comment about schemas bumped me in the right direction.
<shame-faced confession>
I was calling the correct procedure name, but from the wrong schema.
</shame-faced confession>
Thirty lashes with a wet noodle for me, and thanks for the nudge, it works correctly. Amazing, how well things operate when you do it right. BTW, the language is Czech.
Pete
Viewing 3 posts - 1 through 2 (of 2 total)
You must be logged in to reply to this topic. Login to reply