2015-10-26 45 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放入引号可修复错误并且查询会运行。谢谢您的帮助!

相关问题