The formal parameter "@SA_AkcesAutoID" was not declared as an OUTPUT parameter, but the actual parameter passed in requested output.

  • 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

  • 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.

  • 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