Je développe ma toute première procédure stockée au SQL Server 2008 R2
et j'ai besoin de conseils concernant le message d'erreurs.Procédure ou fonction !!! a trop d'arguments spécifiés
procédure ou une fonction xxx trop d'arguments spécifiés
que je reçois après l'exécution de la procédure stockée [dbo].[M_UPDATES]
qui appelle une autre procédure stockée appelée etl_M_Update_Promo
.
Lorsque vous appelez [dbo].[M_UPDATES]
(code, voir ci-dessous) par l'intermédiaire droit de la souris de la souris et « Exécuter la procédure stockée » la requête qui apparaît dans la fenêtre de requête est:
USE [Database_Test]
GO
DECLARE @return_value int
EXEC @return_value = [dbo].[M_UPDATES]
SELECT 'Return Value' = @return_value
GO
La sortie est
Msg 8144, niveau 16, état 2, procédure etl_M_Update_Promo, ligne 0
Procédure et fonction etl_M_Update_Promo a trop d'arguments spécifiés.
QUESTION: Qu'est-ce que ce message d'erreur signifie exactement, à savoir où sont trop nombreux arguments? Comment les identifier?
J'ai trouvé plusieurs threads demandant à propos de ce message d'erreur, mais les codes fournis étaient tous différents du mien (sinon dans une autre langue comme C#
de toute façon). Donc, aucune des réponses n'a résolu le problème de ma requête SQL
(c'est-à-dire SPs). Remarque: ci-dessous, je fournis le code utilisé pour les deux SP, mais j'ai changé les noms de base de données, les noms de table et les noms de colonne. Donc, s'il vous plaît, ne vous préoccupez pas des conventions de nommage, ce ne sont que des exemples de noms!
Merci d'avance pour tous conseils et pensées!
(1) Code pour le Service Pack 1 [dbo]. [M_UPDATES]
USE [Database_Test]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[ M_UPDATES] AS
declare @GenID bigint
declare @Description nvarchar(50)
Set @GenID = SCOPE_IDENTITY()
Set @Description = 'M Update'
BEGIN
EXEC etl.etl_M_Update_Promo @GenID, @Description
END
GO
(2) Code pour le Service Pack 2 [etl_M_Update_Promo]
USE [Database_Test]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [etl].[etl_M_Update_Promo]
@GenId bigint = 0
as
declare @start datetime = getdate()
declare @Process varchar (100) = 'Update_Promo'
declare @SummeryOfTable TABLE (Change varchar (20))
declare @Description nvarchar(50)
declare @ErrorNo int
, @ErrorMsg varchar (max)
declare @Inserts int = 0
, @Updates int = 0
, @Deleted int = 0
, @OwnGenId bit = 0
begin try
if @GenId = 0 begin
INSERT INTO Logging.dbo.ETL_Gen (Starttime)
VALUES (@start)
SET @GenId = SCOPE_IDENTITY()
SET @OwnGenId = 1
end
MERGE [Database_Test].[dbo].[Promo] AS TARGET
USING OPENQUERY(M ,'select * from m.PROMO') AS SOURCE
ON (TARGET.[E] = SOURCE.[E])
WHEN MATCHED AND TARGET.[A] <> SOURCE.[A]
OR TARGET.[B] <> SOURCE.[B]
OR TARGET.[C] <> SOURCE.[C]
THEN
UPDATE SET TARGET.[A] = SOURCE.[A]
,TARGET.[B] = SOURCE.[B]
, TARGET.[C] = SOURCE.[c]
WHEN NOT MATCHED BY TARGET THEN
INSERT ([E]
,[A]
,[B]
,[C]
,[D]
,[F]
,[G]
,[H]
,[I]
,[J]
,[K]
,[L]
)
VALUES (SOURCE.[E]
,SOURCE.[A]
,SOURCE.[B]
,SOURCE.[C]
,SOURCE.[D]
,SOURCE.[F]
,SOURCE.[G]
,SOURCE.[H]
,SOURCE.[I]
,SOURCE.[J]
,SOURCE.[K]
,SOURCE.[L]
)
OUTPUT $ACTION INTO @SummeryOfTable;
with cte as (
SELECT
Change,
COUNT(*) AS CountPerChange
FROM @SummeryOfTable
GROUP BY Change
)
SELECT
@Inserts =
CASE Change
WHEN 'INSERT' THEN CountPerChange ELSE @Inserts
END,
@Updates =
CASE Change
WHEN 'UPDATE' THEN CountPerChange ELSE @Updates
END,
@Deleted =
CASE Change
WHEN 'DELETE' THEN CountPerChange ELSE @Deleted
END
FROM cte
INSERT INTO Logging.dbo.ETL_log (GenID, Startdate, Enddate, Process, Message, Inserts, Updates, Deleted,Description)
VALUES (@GenId, @start, GETDATE(), @Process, 'ETL succeded', @Inserts, @Updates, @Deleted,@Description)
if @OwnGenId = 1
UPDATE Logging.dbo.ETL_Gen
SET Endtime = GETDATE()
WHERE ID = @GenId
end try
begin catch
SET @ErrorNo = ERROR_NUMBER()
SET @ErrorMsg = ERROR_MESSAGE()
INSERT INTO Logging.dbo.ETL_Log (GenId, Startdate, Enddate, Process, Message, ErrorNo, Description)
VALUES (@GenId, @start, GETDATE(), @Process, @ErrorMsg, @ErrorNo,@Description)
end catch
GO
Excellent! Cela fonctionne après avoir supprimé @Description NVARCHAR (50) de la section déclarer. Merci d'avoir répondu si vite et si clairement! – user2006697
@Darren Existe-t-il un mécanisme pour ignorer les paramètres inattendus? –
@AliAdlavaran les ajouter une valeur par défaut – CiucaS