在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原创'数据类型为int。
似乎问题在于
EXECUTE @x = SP_1_10_2;
你能告诉我出了什么问题吗?为什么要尝试转换为int?
答案 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