首先,我是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;
答案 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
希望这有帮助。