2016-06-10 84 views
0

首先我是SQL新手,但我有一個很好的Java背景。我的問題是,我試圖讓這個程序返回一個varchar,但它不讓我。使存儲過程返回一個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; 
+1

[存儲過程返回varchar]可能的重複(http://stackoverflow.com/questions/924455/stored-procedure-returns-varchar) –

+0

這看起來像它可以簡化爲'SELECT MasterName FROM PS_GameData。 dbo._GuildsBack GB JOIN(SELECT TOP 1 GuildID,GuildPoint FROM PS_GameData.dbo._GuildRankPoint ORDER BY GuildPoint DESC)GP ON GP.GuildID = GB.GuildID'或類似的東西。 – ZLK

+0

你**不能**在存儲過程中使用'RETURN'來返回'varchar' - 這是不可能的。所以你需要像你一樣使用'SELECT' - 所以這真的成爲你如何調用這個存儲過程的問題,以及你如何處理返回的結果集? –

回答

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 
0

您可以使用output參數。但是,請注意您的SQL查詢。我對您的數據模型不熟悉,但看起來您的查詢可能會導致運行時錯誤。例如,是否有可能有多個GuildIDGuildPoints相同?如果是這樣,存儲過程中的第二個查詢將失敗並返回如下所示的消息。

 
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 

希望這會有所幫助。