【问题标题】:SqlException: Procedure or function expects parameter which was not supplied SSMSSqlException:过程或函数需要未提供 SSMS 的参数
【发布时间】:2017-05-25 14:30:17
【问题描述】:

我确信解决方案非常简单,但我一直在得到一个

SqlException:过程或函数需要未提供的参数

错误。我不是 SQL 向导,但对我来说参数看起来还不错。我确实更改了参数并且没有收到此错误,但是当我一直开始收到它时,我将存储过程恢复到我知道事实很好但仍然收到它的原始版本。

我尝试像这样执行存储过程

EXECUTE [dbo].[BHS_CloseCnt_Print_PackList] @palletid = '562992'

填充了一个变量。这个存储过程调用一个函数来确定订单的状态,如果我插入的变量并用这个方法检查符合函数的标准,我就会得到预期的回报。

如果容器不满足功能标准,我会得到一个我认为没问题的 null。

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER procedure [dbo].[BHS_CloseCnt_Print_PackList]
    (@PalletId numeric)
AS
BEGIN
    Declare @PO as nvarchar(50)

    Declare @Internal_Shipment_Num as numeric
    Declare @Internal_Shipment_Line_Num as numeric

    select top 1 
        @Internal_Shipment_Num = sc.INTERNAL_SHIPMENT_NUM, 
        @Internal_Shipment_Line_Num = sc.INTERNAL_SHIPMENT_LINE_NUM 
    from 
        SHIPPING_CONTAINER sc
    where 
        INTERNAL_CONTAINER_NUM = @PalletId 
        or PARENT = @PalletId 
        and INTERNAL_SHIPMENT_LINE_NUM is not null

    select @PO = dbo.fn_BHS_AllPOPLTS_CLOSED(@PalletId, @Internal_Shipment_Num, @Internal_Shipment_Line_Num)

    print @PO

    if @PO is not null
    Begin
        select @PalletId 'INTERNAL_CONTAINER_NUM',  '60' 'DOCUMENT_TYPE'
    End
End

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER FUNCTION [dbo].[fn_BHS_AllPOPLTS_CLOSED]
    (@palletId numeric,
     @Internal_Shipment_Num numeric,
     @Internal_Shipment_Line_Num numeric)
RETURNS nvarchar(50)
AS
BEGIN
    Declare @PO nvarchar(50)
    Declare @OPENPO nvarchar(50)
    Declare @IntShip as numeric 

    select @PO = isnull(sd.CUSTOMER_PO, 'FEIT')
    from SHIPMENT_DETAIL sd
    where sd.INTERNAL_SHIPMENT_LINE_NUM = @Internal_Shipment_Line_Num
      and sd.internal_shipment_num = @Internal_Shipment_Num

    select @OPENPO = isnull(sd.CUSTOMER_PO, '') 
    from shipping_container sc
    join  SHIPMENT_DETAIL sd on sd.INTERNAL_SHIPMENT_LINE_NUM = sc.INTERNAL_SHIPMENT_LINE_NUM
    where sd.CUSTOMER_PO = @PO and sc.INTERNAL_SHIPMENT_NUM = @Internal_Shipment_Num
      and sc.status < 600

    if(isnull(@OPENPO, '') != '')
    Begin
        set @PO = null
    End

    return @PO

End

【问题讨论】:

  • fn_BHS_AllPOPLTS_CLOSED 的代码怎么样?需要多少个参数,能分享一下代码吗?您提供的 EXECUTE 语句似乎有效,那么它可能是函数吗?
  • Nemanja,我刚刚修改为包含函数脚本。我确实尝试向函数添加一个参数并将其用作 SP 的新参数,但是当我开始收到错误时,我将两个都恢复到以前已知的工作版本,但仍然收到错误。
  • 好的,我刚刚运行了你的代码,它可以工作,所以我无法重现这个问题。如果我理解正确,您是说此代码适用于工作版本,但由于您同时撤消的更改,您仍然会收到错误消息。如果是这样,那么您可能会收到错误,因为正在执行旧版本的函数或 SP。也许看看stackoverflow.com/questions/22721306/…上的建议
  • 就是这样。我按照其中一个响应中的建议运行了 DBCC FREEPROCCACHE 以清除缓存,并且能够成功运行 SP,并且没有出现预期的错误,谢谢!!!
  • 太棒了。将其发布为答案并接受它,以便帮助其他人。

标签: sql-server stored-procedures ssms


【解决方案1】:

虽然已知的工作版本已恢复,但存储过程似乎已存储了我之前编辑的缓存。

对此的解决方案是运行 DBCC FREEPROCCACHE 以清除存储过程缓存,并且我能够按预期执行。

感谢内曼加·佩罗维奇!

【讨论】:

    猜你喜欢
    • 2011-02-05
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多