Хранимая процедура SQL Server работает только с локально повторно объявленными переменными;не переменные передаются в процедуру - PullRequest
0 голосов
/ 23 мая 2018

Я отредактировал свои блоки кода 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 втип данных числовой.

Если я вызываю хранимую процедуру вручную в терминале (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. есть ли способ исправить мою проблему, не используя этот глупый трюк «повторного объявления»?

Заранее благодарен за любую помощь с этим.

1 Ответ

0 голосов
/ 23 мая 2018

Я думаю, что вы можете получить ту же ошибку, если используете 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;

Тогда оба оператора будут частью тела хранимой процедуры, и вы сможете работать над исправлениемданные, чтобы он работал.

...