2

在 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 original”转换为数据类型 int 时转换失败。

好像问题就出在这条线上

EXECUTE @x = SP_1_10_2;

你能告诉我有什么问题吗?为什么它试图转换为int?

4

2 回答 2

6

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

在您的情况下,您只需要使用OUTPUT类似于 C# 或 C++ 中的传递引用的变量。您将变量传递给 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

于 2012-11-26T19:06:14.353 回答
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
于 2013-01-08T23:36:07.673 回答