Member 14128924 Ответов: 2

Справка по процедуре Sql - формальный параметр "@psvrno" не был объявлен


- Привет!

Работая с сервером(игровым сервером), я попал в беду и не могу получить полное исправление.
Моя ошибка заключается в следующем
SendNoticeMail : [Microsoft][ODBC SQL Server Driver][SQL Server]The formal parameter "@pSvrNo" was not declared as an OUTPUT parameter, but the actual parameter passed in requested output.(1)

Процедура выглядит следующим образом:
ALTER  PROCEDURE [dbo].[UspMailNoticeSend]
	 @pSender			NVARCHAR(20),
	 @pMailType			TINYINT,
	   @Preceiver			NVARCHAR(20),
	   @ptitle			NVARCHAR(40),
	 @pMain				NVARCHAR(200),
	 @pKeepTerm			TINYINT,
	 @pMoney			BIGINT,
	 @pItemNo			INT,
	 @pItemCnt			INT,
	 @pDur				INT,
	 @pMaxDur			INT,
	 @pIsBind			BIT,
	 @pUnBindCnt		TINYINT,
	   @PenchantStep		TINYINT,
	   @premainMin		INT,
	   @premainBase		INT,
	 @pValidMin			INT = 0,
	 @pSvrNo			SMALLINT = 0,		
	 @pItemSerial		BIGINT			OUTPUT,
	 @pMailNo			INT				OUTPUT, 
	 @pDate				DATETIME		OUTPUT,
	 @pRsMoney			BIGINT			OUTPUT
AS
	SET NOCOUNT ON;
	SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
	
	DECLARE   @amailCnt		INT
	DECLARE @aReceiverNo	INT
	DECLARE   @ASEnderMoney	BIGINT
	DECLARE @aEndDate		SMALLDATETIME
	DECLARE @aRead			TINYINT

	SELECT	@pMailNo = 0
		,	@pItemSerial = 0
		,	@pDate = GETDATE()
		,	@pRsMoney = 0
		,   @amailCnt = 0
		,	@aReceiverNo = 0
		,   @ASEnderMoney = 0
		,	@aRead = 0

	
	IF(@pMailType <> 1)
	BEGIN
		RETURN (1);
	END


	IF(@pValidMin > 0)
	BEGIN
		SET @aEndDate = DATEADD("n", @pValidMin, GETDATE())
	END
	ELSE
	BEGIN
		SET @aEndDate = dbo.UfnGetEndDate(GETDATE(), 0)
	END

	SELECT @aReceiverNo = mPcNo FROM dbo.TblPc WHERE mPcNm =   @Preceiver
	IF( @aReceiverNo = 0)
	BEGIN
		RETURN (2);			
	END

	SELECT @pMailNo = ISNULL(MAX(mMailNo), 0) + 1 FROM dbo.TblPcMail WHERE mPcNo = @aReceiverNo
	SELECT   @amailCnt = COUNT(mPcNo) FROM dbo.tblPcMail WHERE mPcNo = @aReceiverNo AND mMailType = @pMailType

	BEGIN TRY
		BEGIN TRAN
			IF( @pItemNo <> 0 )
			BEGIN
				EXEC dbo.UspGetItemSerial @pSvrNo, @pItemSerial OUTPUT; 	
				IF @pItemSerial <= 0  
					BEGIN
						RAISERROR ('Error raised in TRY block.', -- Message text.
									16	, -- Severity.
									2 -- State.  
									);	
					END

				INSERT INTO dbo.TblPcMailItem ( 
						 mRegDate, mSerialNo, mPcNo, mItemNo, mCnt,
						 mDur, mMaxDur, mIsBind, mUnBindCnt, mEnchantStep,
						 mRemainMin, mRemainBase, mEndDate )
				VALUES ( @pDate, @pItemSerial, @aReceiverNo, @pItemNo, @pItemCnt,
						 @pDur, @pMaxDur, @pIsBind, @pUnBindCnt,   @PenchantStep,
						   @premainMin,   @premainBase, @aEndDate)
			END

			IF(   @amailCnt >= 24 )
			BEGIN
				SET @aRead = 2
			END

			INSERT INTO dbo.TblPcMail ( 
					 mRegDate, mPcNo, mMailNo, mMailType, mSender, mTitle, mMain, mMoney, mItemSerial, mRead, mKeepTerm)
			VALUES ( @pDate, @aReceiverNo, @pMailNo, @pMailType, @pSender,   @ptitle, @pMain, @pMoney, @pItemSerial, @aRead, @pKeepTerm)
		
		COMMIT TRAN;
	END TRY
	
	BEGIN CATCH
		ROLLBACK TRAN;
		RETURN (1);
	END CATCH
	
	RETURN (0);


Процедура что делает:
-автоматическая отправка предметов игроку с вознаграждением по электронной почте в игре

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

Надеюсь, кто - нибудь даст мне исправление.

Спасибо за внимание!

Что я уже пробовал:

I tryed to execute it via MSSQL seems to run succefully but when server execute it thats the error i got.

2 Ответов

Рейтинг:
18

Richard Deeming

Код, вызывающий хранимую процедуру, указывает, что @pSvrNo это OUTPUT параметр. Но внутри хранимой процедуры она не объявляется как OUTPUT.

У вас есть два варианта, чтобы исправить это: добавить OUTPUT этому параметру, как и в случае со следующими четырьмя параметрами; или измените вызывающий код так, чтобы он не объявлял этот параметр как OUTPUT параметр.

Если вам нужна помощь, чтобы изменить код вызова, то вам нужно будет показать нам соответствующую часть этого кода.

Возврат данных из хранимой процедуры - SQL Server | Microsoft Docs[^]


Рейтинг:
0

Member 14128924

Я объявил это как вывод ошибки, все еще не решенной.

Я получаю другую ошибку:

SendNoticeMail : [Microsoft][ODBC SQL Server Driver][SQL Server]Implicit conversion from data type datetime to int is not allowed. Use the CONVERT function to run this query.(1)


MadMyche

Похоже, первоначальная ошибка была устранена, и вы нашли другую.
В сообщении об ошибке очень просто говорится, что он был определен как DateTime, но должен был быть INT.

Member 14128924

его smalldatetime определен, и я должен определить его как int? есть какие-нибудь предложения?

MadMyche

Это все зависит от того, какая другая хранимая процедура dbo.UspGetItemSerial нуждается, так как это единственное место, где он используется

Member 14128924

Его не используют в dbo.spGetItemSerial его просят теперь преобразовать в таблицу dbo.TblPcMail
Столбец mRegDate из smalldatetime в INT...Есть какие-нибудь предложения, чтобы сделать это?Попробовал несколько различных запросов преобразования sql возвращает не имя столбца