SQL SERVER – The procedure attempted to return a status of NULL, which is not allowed. A status of 0 will be returned instead.

Here is one of the very common question I receive on SQLAuthority Facebook page. I usually answer them on Facebook but this one I find it very interesting so I decided to answer here.

“There are few of the stored procedure when I try to execute they return following message. Would you please explain what does it mean and is it alright to receive them?

The procedure attempted to return a status of NULL, which is not allowed. A status of 0 will be returned instead.”

Very interesting question and before I explore it further let us answer execute following stored procedure.

-- First Stored Procedure
CREATE PROCEDURE TestSP
AS
DECLARE @MyFirstParam INT
-- Additional Code
RETURN (@MyFirstParam)
GO

Now execute the stored procedure with following code.

EXEC TestSP
GO

When you execute the stored procedure it will return following message:

The ‘TestSP’ procedure attempted to return a status of NULL, which is not allowed. A status of 0 will be returned instead.

If you notice this message, it is clear that this message is due to only one reason – we have declared a variable inside the scope of the Stored Procedure and we have assigned no value to the same procedure before we return the same variable. When any variable is not assigned any value it is by default assumed as a NULL. By Design stored procedures are not allowed to return the NULL value. Hence the value is automatically converted to zero (0) and returned.

We can verify above logic by running the following code:

DECLARE @TestVar INT
EXEC @TestVar = TestSP
SELECT @TestVar TestVar
GO

SQL SERVER - The procedure attempted to return a status of NULL, which is not allowed. A status of 0 will be returned instead. nulltozero

You can see that when you run above code, instead of returning NULL value we get value of Zero (0) and in the message field we get above message.

Alternate Code

To avoid this situation you can modify above stored procedure to not return the value null. You can use ISNULL function before returning the values back from the stored procedure.

CREATE PROCEDURE TestSP
AS
DECLARE @MyFirstParam INT
-- Additional Code
RETURN (ISNULL(@MyFirstParam,0))
GO

Above change in the code will automatically covert the NULL to Zero (0) and it will not show the above message.

Which one is better?

Now the question is which method is better – to use ISNULL and covert it to Zero or let SQL handle this and message show up. Personally I prefer to use ISNULL as that gives me clear idea and there is no ambiguity in my code. I will not have to write additional code to handle NULL when it shows up.

What is your opinion? Please share in the comment area.

Reference: Pinal Dave (https://blog.sqlauthority.com)

Quest

SQL Scripts, SQL Stored Procedure
Previous Post
SQL SERVER – Pass One Stored Procedure’s Result as Another Stored Procedure’s Parameter
Next Post
SQL SERVER – Fix : Error: 217 Implicit conversion from data type datetime to int is not allowed.

Related Posts

5 Comments. Leave new

  • coalesce() is apparently preferable to isnull()

    RETURN (COALESCE(@MyFirstParam,0))

    Reply
  • if SQL 2008 above, use declare & init value

    CREATE PROCEDURE TestSP
    AS
    DECLARE @MyFirstParam INT = 0
    — Additional Code
    RETURN (@MyFirstParam)
    GO

    Reply
  • myprogrammingexp
    April 9, 2013 6:13 pm

    What’s the advantage / difference of preferring COALESCE v/s ISNULL?

    Reply
    • ISNULL is faster. COALESCE doesn’t work in Intellisense. COALESCE supports more than 1 argument. I’d only use COALESCE if you need 2+ arguments.

      Reply
  • Hi,
    Can you help me about this:

    DECLARE @spid INT
    DECLARE @cd_user INT
    DECLARE @TesteNULL TABLE (spid INT, cd_user INT)
    INSERT INTO @TesteNULL VALUES (200, 1)

    SET @spid = @@SPID
    SELECT @cd_user = ISNULL(cd_user, 0) FROM @TesteNULL WHERE spid = @spid
    SELECT @cd_user — returning NULL, not 0.

    Thanks.

    Reply

Leave a Reply