将nvarchar值'Internet Explorer 3 original'转换为数据类型int时转换失败

时间:2012-11-26 18:55:14

标签: tsql int execute nvarchar

在SQL Server 2008(TSQL)中,我创建了一个这样的存储过程:

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

但是,当我试图执行它时:

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

我收到错误:

  

转换nvarchar值' Internet时转换失败   Explorer 3原创&​​#39;数据类型为int。

似乎问题在于

EXECUTE @x = SP_1_10_2;
你能告诉我出了什么问题吗?为什么要尝试转换为int?

2 个答案:

答案 0 :(得分:6)

RETURN不能用于返回nvarchar / varchar等。 RETURN用于返回一个整数,这可以表示为某种状态代码1 = True / 0 = False。阅读更多关于返回的信息:http://msdn.microsoft.com/en-us/library/ms174998.aspx

在您的情况下,您只需要使用类似于C#或C ++中的pass-by-ref的OUTPUT变量。您将变量传递给sproc,sproc会修改它,并在SELECT...之后得到预期的结果。

更改它以使您的参数成为输出参数:

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

这样称呼:

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

然后你可以说:

SELECT 'Most expensive book is', @theValBook

答案 1 :(得分:1)

您还可以创建一个函数来返回所需的值,而不是依赖于数字返回码。 SQL函数非常方便。请参阅下面的示例,该示例使用LIKE运算符

返回具有最高客户端ID的姓氏
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