SQL Server存储过程仅适用于本地重新声明的变量;不是传递给程序的变量

时间:2018-05-22 22:10:44

标签: sql-server tsql stored-procedures asp-classic

我已经编辑了我的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子句。

我基本上有两个问题:

  1. 为什么使用相同的数据重新声明相同的变量类型可以解决问题?
  2. 有没有办法解决我的问题而不使用这种愚蠢的“重新声明”技巧?
  3. 提前感谢您提供任何帮助。

1 个答案:

答案 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;

然后,两个语句都将成为存储过程体的一部分,您可以修复数据,以便它可以工作。