Получение ошибки «Процедура функции ожидает параметр, который не был указан», но все параметры указаны - PullRequest
0 голосов
/ 08 июня 2019

Я пытаюсь написать хранимую процедуру для добавления данных в три таблицы одновременно. Хранимая процедура вызывает три другие хранимые процедуры. У меня есть данные для каждого параметра, но я продолжаю получать ошибку отсутствующего параметра в SQL Server. Проблема в том, что параметр, указанный в сообщении об ошибке, не является частью инструкции EXECUTE основной хранимой процедуры. Запуск sp_help показывает, что я передаю все необходимые параметры основной процедуре. Код ниже.

Error message: Msg 201, Level 16, State 4, Procedure uspAddCustomerJob, Line 0 [Batch Start Line 157]
Procedure or function 'uspAddCustomerJob' expects parameter '@intJobID', which was not supplied.
-- =========================================

-- stored procedure to add customer record to customer table

GO

CREATE PROCEDURE uspAddCustomer
     @intCustomerID AS INTEGER = 0 OUTPUT
    ,@strName AS VARCHAR(250)
    ,@strPhone AS VARCHAR(250)
    ,@strEmail AS VARCHAR(250)
AS
SET XACT_ABORT ON

BEGIN TRANSACTION

    INSERT INTO TCustomers(strName, strPhone, strEmail)
    VALUES (@strname, @strPhone, @strEmail)

COMMIT TRANSACTION

GO

-- =================================================

-- stored procedure to add job to job table

GO

CREATE PROCEDURE uspAddJob
     @intJobID AS INTEGER = 0 OUTPUT
    ,@strJobDescription AS VARCHAR(250)
    ,@dtmStartDate AS DATETIME
    ,@dtmEndDate AS DATETIME
AS
SET XACT_ABORT ON

BEGIN TRANSACTION

    INSERT INTO TJobs(strJobDescription, dtmStartDate, dtmEndDate)
    VALUES (@strJobDescription, @dtmStartDate, @dtmEndDate)

COMMIT TRANSACTION

GO

-- ===================================================

-- stored procedure to add PK's from previous tables to a third table (many-to-many relationship)

GO

CREATE PROCEDURE uspAddCustomerJob 
     @intCustomerJobID AS INTEGER OUTPUT
    ,@intCustomerID AS INTEGER 
    ,@intJobID AS INTEGER

AS
SET XACT_ABORT ON

BEGIN TRANSACTION

    INSERT INTO TCustomerJobs(intCustomerID, intJobID)
    VALUES (@intCustomerID, @intJobID)

COMMIT TRANSACTION

GO

-- =====================================================

-- main stored procedure that calls each component stored procedure, with execution code at the bottom. Running the EXECUTE statement yields the error mentioned above.

GO

CREATE PROCEDURE uspAddCustomerAndJob --main procedure 
     @intCustomerJobID      AS INTEGER  = 0 OUTPUT
    ,@strName               AS VARCHAR(250)
    ,@strPhone              AS VARCHAR(250)
    ,@strEmail              AS VARCHAR(250)
    ,@strJobDescription     AS VARCHAR(250)
    ,@dtmStartDate          AS DATETIME
    ,@dtmEndDate                AS DATETIME

AS
SET XACT_ABORT ON

BEGIN TRANSACTION

    DECLARE @intCustomerID AS INTEGER   = 0
    DECLARE @intJobID AS INTEGER            = 0

    EXECUTE uspAddCustomer @intCustomerID OUTPUT, @strName, @strPhone, @strEmail;

    EXECUTE uspAddJob @intJobID OUTPUT, @strJobDescription, @dtmStartDate, @dtmEndDate;

    EXECUTE uspAddCustomerJob @intCustomerJobID OUTPUT, @intJobID;

COMMIT TRANSACTION

GO

--TEST CODE
DECLARE @intCustomerJobID AS INTEGER;   
EXECUTE uspAddCustomerAndJob @intCustomerJobID OUTPUT, 'Joe Smith', '513-555-9644', 'Jsmith@yahoo.com', 'Fix cracked sewer pipe', '6/1/2019', '6/5/2019'

Ответы [ 2 ]

0 голосов
/ 08 июня 2019

Сообщение об ошибке вводит в заблуждение.В uspAddCustomerAndJob вы пропускаете параметр.

Ваш вызов выглядит следующим образом:

EXECUTE uspAddCustomerJob @intCustomerJobID OUTPUT, @intJobID;

SQL Server принимает ваш первый целочисленный параметр и сопоставляет его с первым целочисленным параметромдочерний процесс, поэтому он думает, что он получает @ intCustomerID.

Вы можете избежать такого рода путаницы, явно назвав свои параметры в вызове, что вы должны сделать в любом случае ради любого (включая себя), кому может понадобитьсяустранить неисправность кода в 3:00 утра однажды.Это будет выглядеть так:

EXECUTE uspAddCustomerJob 
  @intCustomerJobID = @intCustomerJobID OUTPUT, 
  @intCustomerID = @intCustomerID
  @intJobID = @intJobID;

Это выглядит забавно, когда ваши локальные переменные называются так же, как параметры, но дает вам гибкость, чтобы называть их по-разному, когда ситуация подходит.Кроме того, отсутствие пропущенных параметров не вызывает удивления или, по крайней мере, улучшается обмен сообщениями, при котором отсутствует.

0 голосов
/ 08 июня 2019

Ошибка в процедуре, которую вы выполнили.
Определение процедуры для «uspAddCustomerJob» имеет 3 параметра:

CREATE PROCEDURE uspAddCustomerJob 
     @intCustomerJobID AS INTEGER OUTPUT
    ,@intCustomerID AS INTEGER 
    ,@intJobID AS INTEGER

но вызывается с 2, отсутствует @intCustomerID:

EXECUTE uspAddCustomerJob @intCustomerJobID OUTPUT, @intJobID;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...