Conversion failed when converting the nvarchar value 'Internet Explorer 3 original' to data type int

StackOverflow https://stackoverflow.com/questions/13571263

  •  02-12-2021
  •  | 
  •  

Question

In SQL Server 2008 (TSQL), I've created a stored procedure like this:

CREATE PROCEDURE SP_1_10_2
AS
declare @mostValuableBook nvarchar(255)
SELECT @mostValuableBook = Name
FROM books
WHERE price =
    ( SELECT MAX(price)
      FROM books
      WHERE izd LIKE '%BHV%' );
return @mostValuableBook
GO

But, when I'm trying to execute it:

declare @x nvarchar(255)
EXECUTE @x = SP_1_10_2;
SELECT 'The most expensive BHV book:', @x AS 'Name'
GO

I'm getting an error:

Conversion failed when converting the nvarchar value 'Internet Explorer 3 original' to data type int.

It seems like the problem is in the line

EXECUTE @x = SP_1_10_2;

Can you please tell me what's wrong? Why is it trying to convert to int?

Was it helpful?

Solution

RETURN cannot be used to return nvarchar / varchar such as you have. RETURN is used to return an integer, this can be expressed as some sort of status code 1=True / 0=False. Read more about return here: http://msdn.microsoft.com/en-us/library/ms174998.aspx

In your case, you simply need to use OUTPUT variables which is similiar to pass-by-ref in C# or C++. You pass the variable to the sproc, the sproc modifies it, and you get the expected results after a SELECT....

Change it so that your parameters becomes an output parameter:

CREATE PROCEDURE SP_1_10_2
@mostValueableBook nvarchar(255) output
AS
SELECT @mostValuableBook = Name
FROM books
WHERE price =
    ( SELECT MAX(price)
      FROM books
      WHERE izd LIKE '%BHV%' );
SELECT @mostValuableBook
GO

Call it like so:

DECLARE @theValBook nvarchar(255)
EXECUTE SP_1_10_2 @mostValuableBook = @theValBook output

Then you can say:

SELECT 'Most expensive book is', @theValBook

OTHER TIPS

You can also create a function to return the value you desire instead of relying on numeric return codes. SQL Functions come in quite handy. See example below which returns the last name with the highest client id using the LIKE operator

Use MYDB
GO

CREATE Function fn_LastClientIdByName
(
@nameLike NVARCHAR(10)
)
RETURNS NVARCHAR(100)
AS 

BEGIN
DECLARE @result nvarchar(100)
DECLARE @clientName NVARCHAR(100)

SELECT top 1  @clientName = [clientLast] + ' ' + [clientFirst]   
FROM [dbo].[duiClientOnly]
WHERE clientLast like @nameLike + '%'
order by clid desc

select @result = @clientName
return @result
END
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top