2015-10-26 46 views
0

我有這個存儲過程:的SQL Server:存儲過程試圖爲varchar輸出轉換成INT @Return_Value

create proc Sponsors.GetLightBoxAd 
(
@SponsorID varchar(30), 
@ADIDOut varchar(30) OUTPUT, 
@UserID varchar(30), 
@ProjectID varchar(50), 
@PlatformID int 
) 
as 
begin 
    SELECT TOP 1 @ADIDOut = AD.ADID --my output. AD.ADID is a varchar(30) column 
    FROM Sponsors.AD 
    WHERE AD.Active = 1 and AD.SponsorID = @SponsorID 
    ORDER by NEWID() -- I want the first one picked at random 
    IF ISNULL(@ADIDOut,-1) != -1 --if the result set wasn't null, run some update queries with the result 
    BEGIN --These queries do not have output variables. 
    EXEC Sponsors.proc1 @ADIDOut, @SponsorID 
    EXEC Projects.proc2 @ProjectID,@ADIDOut,@UserID,@PlatformID 
    END --end the if 
end --end the proc 
go 

這應該返回一個空值或VARCHAR。 然而,當我嘗試執行查詢,SSMS自動生成此代碼對我來說,運行查詢:

USE [MyDB] 
GO 

DECLARE @return_value int, --Why is this here??? 
     @ADIDOut varchar(30) -- this should be my only output 

EXEC @return_value = [Sponsors].[GetLightBoxAd] 
     @SponsorID = N'Alienware', 
     @ADIDOut = @ADIDOut OUTPUT, 
     @UserID = N'127.0.0.1', 
     @ProjectID = N'TestProject', 
     @PlatformID = 1 

SELECT @ADIDOut as N'@ADIDOut' 

SELECT 'Return Value' = @return_value --why is this here? 

GO 

然後它,因爲它似乎試圖ADIDOut的結果轉換成給我一個錯誤int ...爲什麼有一個int @Rurn_Value變量,爲什麼它試圖把我的實際OUTPUT結果放入它?

+0

您正在使用哪個版本的SQL Server? – Rieekan

+0

這就是SSMS一般爲存儲過程生成EXECUTE語句的方式。它不應該導致任何錯誤。什麼是你得到的錯誤信息? –

+0

@Rieekan SQL Server 2012. – ConnorU

回答

0

錯誤是在這條線:

IF ISNULL(@ADIDOut,-1) != -1 

看來,因爲我把剛剛-1不帶引號作爲比較,SQL讀取此爲整數,因此錯誤是不能把它比作一個可空字符串上調。將-1放入引號可修復錯誤並且查詢會運行。謝謝您的幫助!

相關問題