【发布时间】:2015-10-26 18:22:06
【问题描述】:
我有这个存储过程:
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 @Return_Value 变量,为什么它试图将我的实际 OUTPUT 结果放入其中?
【问题讨论】:
-
您使用的是哪个版本的 SQL Server?
-
这就是 SSMS 通常为存储过程生成 EXECUTE 语句的方式。它不应该导致任何错误。您收到的错误信息是什么?
-
@Rieekan SQL Server 2012。
-
@TabAlleman:消息 245,级别 16,状态 1,过程 GetLightBoxAd,第 16 行将 varchar 值“GamingEvolved1”转换为数据类型 int 时转换失败。 GamingEvolved1 是我呼叫的测试赞助商的 ADID。
-
检查 proc1 和 proc2 参数的数据类型,并确保其中一个不期望您传递
ADIDOut的 int 数据类型。
标签: sql-server stored-procedures