我已经编辑了我的SQL代码块,以便更准确地显示正在发生的事情
假设我有一个简单的存储过程:
CREATE PROCEDURE [DBO].[FOO]
(@VARIABLE VARCHAR(500))
AS
BEGIN
SELECT AVG(BAR)
FROM MYTABLE
WHERE THING = @VARIABLE AND RTRIM(LTRIM(THING)) <> ''
END
当我从我的经典ASP页面调用此存储过程时;在这种情况下将与:
Set foo = Server.CreateObject("ADODB.RecordSet")
curCmd = "Foo 'MYVARIABLE'"
foo.Open curCmd, connectionString
我收到此错误(与页面打开foo对象在同一行):
将varchar转换为数据类型numeric的算术溢出错误。
如果我在终端中手动调用存储过程(IDE?);然后它工作正常。
此外,如果我重新创建存储过程如下:
CREATE PROCEDURE [DBO].[FOO]
(@VARIABLE VARCHAR(500))
AS
BEGIN
DECLARE @VARIABLE2 VARCHAR(500) = @VARIABLE
SELECT AVG(BAR)
FROM MYTABLE
WHERE THING = @VARIABLE2 AND RTRIM(LTRIM(THING)) <> ''
END
然后存储过程运行正常。
我尝试删除并重新创建存储过程(不使用重新声明技巧),但它无法解决问题。
*作为旁白;对插入表中的数据进行验证,以确保仅为THING字段输入数字(整数)。 THING字段也可以为空白;因此,where子句。
我基本上有两个问题:
提前感谢您提供任何帮助。
答案 0 :(得分:0)
如果您使用begin
/ end
,我认为您可能会收到同样的错误:
CREATE PROCEDURE [DBO].[FOO] (
@VARIABLE VARCHAR(500)
)
AS
BEGIN
DECLARE @VARIABLE2 VARCHAR(500) = @VARIABLE;
SELECT AVG(BAR) FROM MYTABLE WHERE THING = @VARIABLE2;
END;
然后,两个语句都将成为存储过程体的一部分,您可以修复数据,以便它可以工作。