Как я могу решить ошибку «Ожидается параметр» для хранимой процедуры - PullRequest
0 голосов
/ 05 ноября 2019

Я получаю эту ошибку

Сообщение 201, Уровень 16, Состояние 4, Процедура sp_GetAllAirports, Строка 0 [Строка пакетного запуска 2]
Процедура или функция 'sp_GetAllAirports' ожидает параметр '@AirportID ', который не был предоставлен. "

Когда я запускаю

EXEC sp_GetAllAirports 

Следующая моя хранимая процедура, которая показывает @AirportID, в чем может быть проблема?

IF OBJECT_ID('sp_GetAllAirports', 'P') IS NOT NULL
    DROP PROCEDURE [dbo].[sp_GetAllAirports]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[sp_GetAllAirports]
    @AirportID INT,
    @ICAOCode VARCHAR(4) NULL,
    @AirportName VARCHAR(MAX),
    @City VARCHAR(MAX),
    @Lat DECIMAL(8,3),
    @Long DECIMAL (11,3),
    @Elevation INT,
    @Country NVARCHAR(MAX)
AS  
BEGIN TRANSACTION
BEGIN TRY
    SET NOCOUNT ON  
    SET ANSI_WARNINGS OFF  
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED  

    --SELECT * FROM tbl_Airports ORDER BY AirportID ASC

    SELECT 
        AirportID, ICAOCode, AirportName, City, 
        Latitude, Longitude, Elevation, CountryFK
    FROM 
        tbl_Airports 
    LEFT JOIN 
        tbl_Countries ON CountryID = tbl_Airports.CountryFK
    WHERE 
        CountryID = tbl_Airports.CountryFK
    ORDER BY 
        AirportID
END TRY
BEGIN CATCH
    DECLARE @ErMessage NVARCHAR(MAX),
            @ErSeverity INT,
            @ErState INT

    SELECT 
        @ErMessage = ERROR_MESSAGE(), 
        @ErSeverity = ERROR_SEVERITY(), 
        @ErState = ERROR_STATE()

    IF @@TRANCOUNT > 0
    BEGIN
        ROLLBACK TRANSACTION
    END

    RAISERROR(@ErMessage, @ErSeverity, @ErState)
END CATCH

IF @@TRANCOUNT > 0
BEGIN
    COMMIT TRANSACTION
END
GO

1 Ответ

0 голосов
/ 05 ноября 2019

Ваша хранимая процедура определена для ожидания аргументов (AirportID, ICAOCode, AirportName, City, Lat, Long, Elevation и Country):

CREATE PROCEDURE [dbo].[sp_GetAllAirports]

@AirportID INT,
@ICAOCode VARCHAR(4) NULL,
@AirportName VARCHAR(MAX),
@City VARCHAR(MAX),
@Lat DECIMAL(8,3),
@Long DECIMAL (11,3),
@Elevation INT ,
@Country NVARCHAR(MAX)


AS  
...

Однако он не использует ни одного из них. Поэтому вам, вероятно, нужно просто удалить их:

CREATE PROCEDURE [dbo].[sp_GetAllAirports]

AS  
...

В качестве альтернативы, убедитесь, что аргументы используются в SP (так что имеет смысл ожидать аргументы), и передайте значения соответственно (sp_GetAllAirports 1234), например:

CREATE PROCEDURE [dbo].[sp_GetAllAirports]

@AirportID INT

AS  

....

SELECT AirportID, ICAOCode, AirportName, City, Latitude, Longitude, Elevation, CountryFK
FROM tbl_Airports 
LEFT JOIN tbl_Countries ON CountryID = tbl_Airports.CountryFK
WHERE CountryID = tbl_Airports.CountryFK
    AND AirportID = @AirportID  -- Using first argument here
ORDER BY AirportID

....

Или, наконец, укажите значения аргументов по умолчанию, например:

CREATE PROCEDURE [dbo].[sp_GetAllAirports]

@AirportID INT = NULL,
@ICAOCode VARCHAR(4) = 'FOO',
...

AS
...

Таким образом, вам не придется явно передавать какие-либо значения аргументов. Однако вам все равно придется использовать аргументы, чтобы аргументы имели смысл в первую очередь.

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