程序或功能!指定的参数过多 [英] Procedure or function !!! has too many arguments specified

查看:199
本文介绍了程序或功能!指定的参数过多的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发 SQL Server 2008 R2 中的第一个存储过程,需要有关错误消息的建议。



< blockquote>

过程或函数xxx指定的参数过多


c $ c> [dbo]。[M_UPDATES] 调用另一个名为 etl_M_Update_Promo 的存储过程。

当通过鼠标右键单击和执行存储过程调用查询中出现的查询时调用 [dbo]。[M_UPDATES] -window is:

  USE [Database_Test] 
GO

DECLARE @return_value int

EXEC @return_value = [dbo]。[M_UPDATES]

SELECT'返回值'= @return_value

GO

输出为


Msg 8144,级别16,状态2,过程etl_M_Update_Promo,行0

过程或函数etl_M_Update_Promo指定的参数过多。


QUESTION :此错误消息是什么意思,即哪里有太多参数?如何识别它们?



我发现几个线程询问此错误消息,但提供的代码都与我不同(如果不是其他语言如 C#反正)。所以没有答案解决了我的 SQL 查询(即SP)的问题。



注意:该代码用于两个SP,但我更改了数据库名称,表名和列名称。所以,请不要担心命名约定,这些只是示例名称!



先感谢任何建议和想法!



(1)SP1的代码[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)

设置@GenID = SCOPE_IDENTITY()
设置@Description ='M更新'

BEGIN
EXEC etl.etl_M_Update_Promo @GenID,@Description
END

GO

(2)SP2的代码[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
,@更新int = 0
,@Deleted int = 0
,@OwnGenId位= 0

开始尝试


如果@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
使用OPENQUERY(M,'select * from m.PROMO')as SOURCE
ON(TARGET。[E] = SOURCE。[E])


当匹配和目标[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]

当目标不成功时
INSERT([E]
,[A]
,[B]
,[C]
,[D]
,[F]
,[G]
,[H]
,[I] ,[J]
,[K]
,[L]

VALUES(SOURCE。[E]
,SOURCE。 ,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
更改,
COUNT(*)AS CountPerChange
FROM @SummeryOfTable
GROUP BY更改


SELECT
@Inserts =
CASE更改
WHEN'INSERT'THEN CountPerChange ELSE @Inserts
END,
@Updates =
CASE更改
WHEN'UPDATE'THEN CountPerChange ELSE @Updates
END,
@Deleted =
CASE更改
WHEN'DELETE' THEN CountPerChange ELSE @Deleted
END
FROM cte


INSERT INTO Logging.dbo.ETL_log(GenID,Startdate,Enddate,Process,Message,Inserts,Updates,已删除,说明)
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,进程,消息,错误无,描述)
值(@GenId,@start,GETDATE(),@Process,@ErrorMsg,@ ErrorNo,@ Description)



GO


解决方案

参数(@GenId和@Description):

  EXEC etl.etl_M_Update_Promo @GenID,@Description 

但是,您已声明函数接受1个参数:

  ALTER PROCEDURE [etl]。[etl_M_Update_Promo] 
@GenId bigint = 0

SQL Server告诉您 [etl_M_Update_Promo] 只有1个参数( @GenId



您可以通过指定 @Description 来更改过程以接受两个参数。

  ALTER PROCEDURE [etl]。[etl_M_Update_Promo] 
@GenId bigint = 0,
@Description NVARCHAR(50)
AS

....其余的代码。


I am developing my very first stored procedure in SQL Server 2008 R2 and need advice concerning the errors message.

Procedure or function xxx too many arguments specified

which I get after executing the stored procedure [dbo].[M_UPDATES] that calls another stored procedure called etl_M_Update_Promo.

When calling [dbo].[M_UPDATES] (code see below) via right-mouse-click and ‘Execute stored procedure’ the query that appears in the query-window is:

USE [Database_Test]
GO

DECLARE @return_value int

EXEC    @return_value = [dbo].[M_UPDATES]

SELECT  'Return Value' = @return_value

GO

The output is

Msg 8144, Level 16, State 2, Procedure etl_M_Update_Promo, Line 0
Procedure or function etl_M_Update_Promo has too many arguments specified.

QUESTION: What does this error message exactly mean, i.e. where are too many arguments? How to identify them?

I found several threads asking about this error message, but the codes provided were all different to mine (if not in another language like C# anyway). So none of the answers solved the problem of my SQL query (i.e. SPs).

Note: below I provide the code used for the two SPs, but I changed the database names, table names and column names. So, please, don’t be concerned about naming conventions, these are only example names!

Thanks in advance for any advice and thoughts!

(1) Code for SP1 [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 for SP2 [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

解决方案

You invoke the function with 2 parameters (@GenId and @Description):

EXEC etl.etl_M_Update_Promo @GenID, @Description

However you have declared the function to take 1 argument:

ALTER PROCEDURE [etl].[etl_M_Update_Promo]
    @GenId bigint = 0

SQL Server is telling you that [etl_M_Update_Promo] only takes 1 parameter (@GenId)

You can alter the procedure to take two parameters by specifying @Description.

ALTER PROCEDURE [etl].[etl_M_Update_Promo]
    @GenId bigint = 0,
    @Description NVARCHAR(50)
AS 

.... Rest of your code.

这篇关于程序或功能!指定的参数过多的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆