Получение ошибки при попытке выполнить процедуру внутри процедуры - PullRequest
0 голосов
/ 25 октября 2019

Я пытаюсь написать процедуру, которая выполняет другую процедуру внутри нее, но я получаю эту ошибку

Неверный синтаксис рядом с '@ PRIMARY_AM'

но я получаю эту ошибку только с переменными, которые имеют функцию CAST() ИЛИ ISNULL() ИЛИ REPLACE(). Если я закомментирую строку с @PRIMARY_AM, она скажет

Неверный синтаксис рядом с 'ISNULL'

CREATE PROCEDURE  [dbo].[RUN_PROCESS]
   @PRIMARY_NO VARCHAR(20) = NULL,
   @COMBINED_AM INT = NULL,
   @PRIMARY_BOR VARCHAR(40) = NULL,
   @PRIMARY_AM INT = NULL,
   @SECONDARY_AM INT = NULL,
   @SECONDARY_DT SMALLDATETIME = NULL,
   @PRIMARY_CD VARCHAR(10) = NULL,
   @O_ID INT OUTPUT    

AS

EXEC dbo.LINK_PROCESS
    @PRIMARY_NO = @PRIMARY_NO,
    @COMBINED_AM = CAST(@PRIMARY_AM + @SECONDARY_AM AS VARCHAR),
    @PRIMARY_BOR = REPLACE(ISNULL(@PRIMARY_BOR, ''), '''',' '),
    @PRIMARY_AM = CAST(ISNULL(@PRIMARY_AM, 0) AS VARCHAR),
    @SECONDARY_AM = CAST(ISNULL(@SECONDARY_AM, 0) AS VARCHAR),
    @SECONDARY_DT = CAST(@SECONDARY_DT AS VARCHAR),
    @PRIMARY_CD = ISNULL(@PRIMARY_CD, ''),
    @O_ID = @O_ID OUTPUT;

Если я удалю эти функции CAST(),REPLACE() и ISNULL() тогда я могу выполнить запрос без проблем. Я не знаю, почему это не работает.

Я использую SQL Server 2005

1 Ответ

2 голосов
/ 25 октября 2019

Это решение моей проблемы, благодаря Алексу и его комментарию под моим вопросом

Хранимые процедуры, принимают параметры (переменные и константы), но не выражения. Вы должны сделать все кастинг перед вызовом вашего SP. - Алекс

CREATE PROCEDURE  [dbo].[RUN_PROCESS]
   @PRIMARY_NO VARCHAR(20) = NULL,
   @COMBINED_AM INT = NULL,
   @PRIMARY_BOR VARCHAR(40) = NULL,
   @PRIMARY_AM INT = NULL,
   @SECONDARY_AM INT = NULL,
   @SECONDARY_DT SMALLDATETIME = NULL,
   @PRIMARY_CD VARCHAR(10) = NULL,
   @O_ID INT OUTPUT

AS

DECLARE @COMBINED VARCHAR
SET @COMBINED = CAST(@PRIMARY_AM + @SECONDARY_AM AS VARCHAR)
DECLARE @PRIM_BOR VARCHAR(40)
SET @PRIM_BOR = REPLACE(ISNULL(@PRIMARY_BOR, ''), '''',' ')
DECLARE @PRIM_AM VARCHAR
SET @PRIM_AM = CAST(ISNULL(@PRIMARY_AM, 0) AS VARCHAR)
DECLARE @SEC_AM VARCHAR
SET @SEC_AM = CAST(ISNULL(@SECONDARY_AM, 0) AS VARCHAR)
DECLARE @SEC_DT VARCHAR
SET @SEC_DT = CAST(@SECONDARY_DT AS VARCHAR)
DECLARE @PRIM_CD VARCHAR(10)
SET @PRIM_CD = ISNULL(@PRIMARY_CD, '')

EXEC dbo.LINK_PROCESS
    @PRIMARY_NO = @PRIMARY_NO,
    @COMBINED_AM = @COMBINED,
    @PRIMARY_BOR = @PRIM_BOR,
    @PRIMARY_AM = @PRIM_AM,
    @SECONDARY_AM = @SEC_AM,
    @SECONDARY_DT = @SEC_DT,
    @PRIMARY_CD = @PRIM_CD,
    @O_ID = @O_ID OUTPUT;
...