使存储过程返回VarChar

时间:2016-06-10 05:01:03

标签: sql sql-server stored-procedures

首先,我是SQL的新手,但我有一个很棒的Java背景。我的问题是我试图让这个程序返回varchar,但它不会让我。

我尝试使用RETURN语句(我现在知道它只返回INTS)和SELECT语句,但由于某种原因它继续返回一个int。

这是我的代码

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE get_TopGuildLeader
AS
    --Variables
    DECLARE @LeaderUID VARCHAR(20);
    DECLARE @GuildID INT
    DECLARE @MaxPoints INT

    --Selecting Leader
    SET @MaxPoints = (SELECT MAX(GuildPoint) 
                      FROM PS_GameData.dbo._GuildRankPoint)
    SET @GuildID = (SELECT GuildID 
                    FROM PS_GameData.dbo._GuildRankPoint 
                    WHERE GuildPoint = @MaxPoints);
    SET @LeaderUID = (SELECT MasterName 
                      FROM PS_GameData.dbo._GuildsBack 
                      WHERE GuildID = @GuildID);

    --Return Leader Name
    SELECT @LeaderUID;

3 个答案:

答案 0 :(得分:2)

1)根据MSDN,RETURN的语法很简单:

RETURN [ integer_expression ]   

正如我们所看到的,RETURN语句只能返回一个INT值。

2)根据Doc,RETURN应该用于返回错误代码。

  

存储过程可以返回一个称为返回码的整数值   指示过程的执行状态。您指定退货   使用RETURN语句的存储过程的代码。

3)解决方案是使用OUTPUT参数:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE dbo.get_TopGuildLeader
@LeaderUID VARCHAR(20) OUTPUT
AS
BEGIN
    --Variables
    DECLARE @GuildID INT
    DECLARE @MaxPoints INT

...

    SET @LeaderUID = (SELECT MasterName 
                      FROM PS_GameData.dbo._GuildsBack 
                      WHERE GuildID = @GuildID);

    --Return Leader Name -- No needed anymore
    -- SELECT @LeaderUID; 
    -- ...
END
GO

- 测试

DECLARE @p VARCHAR(20)
EXEC dbo.get_TopGuildLeader @LeaderUID = @p OUTPUT
SELECT @p AS Blaaaaaaa

答案 1 :(得分:0)

您需要使用OUTPUT parameters而不是SELECT来返回数据。 请参阅如何实现此目的的链接: https://technet.microsoft.com/en-us/library/ms187004(v=sql.105).aspx 希望这有帮助!

答案 2 :(得分:0)

您可以使用output参数。但是,请小心SQL查询。我不熟悉您的数据模型,但看起来您的查询可能会导致运行时错误。例如,是否可能有多个GuildID具有相同数量的GuildPoints?如果是这样,存储过程中的第二个查询将失败并返回如下所示的消息。

Msg 512, Level 16, State 1, Line 2
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, , >= or when the subquery is used as an expression.

有很多方法可以接近并防范这个潜在的问题。下面是如何将逻辑合并为一个紧凑查询并保证始终返回一行的示例。

create proc dbo.GetTopGuildLeader
    @LeaderId varchar(20) output
as
    set @LeaderId = (
        select top 1 gb.MasterName 
        from PS_GameData.dbo._GuildRankPoint grp
        join PS_GameData.dbo._GuildsBack gb
            on grp.GuildID = gb.GuildID
        order by GuildPoint);
go

希望这有帮助。