【问题标题】:SQL Server - Trouble passing variable to a stored procedureSQL Server - 将变量传递给存储过程时遇到问题
【发布时间】:2012-03-28 10:32:09
【问题描述】:

我知道这是一个基本问题 - 但我无法找到完成此任务的正确方法。

我需要将变量传递给 SQL Server 2008 存储过程并返回查询。

这是存储过程:

CREATE PROCEDURE pOrders
AS
    DECLARE @enteredClientID varchar(20);
    DECLARE @Results table (ClientID varchar(20), Num_orders int);
BEGIN
    SET NOCOUNT ON;

    -- Get all the order from the client
    INSERT INTO @Results
      SELECT ClientID, sum(Num_orders)
      FROM Orders O
      WHERE O.ClientID = @enteredClientID
      GROUP BY O.ClientID);

    -- Insert the orders into the results table --
    SELECT *
    FROM @Results;

END
GO;

现在,我将执行存储过程并返回结果:

exec pOrders
set @enteredClientID = 'ABC123456789'

我收到此错误消息:

必须声明标量变量“@enteredClientID”。

但是,我声明了变量....我错过了什么?

【问题讨论】:

    标签: sql-server sql-server-2008 stored-procedures


    【解决方案1】:

    你没有声明一个参数,而是一个局部变量。按照您的意愿声明它:

    CREATE PROCEDURE pOrders (@enteredClientID varchar(20))
    AS
        DECLARE @Results table (ClientID varchar(20), Num_orders int);
    
        SET NOCOUNT ON;
    
        -- Get all the order from the client
        INSERT INTO @Results
        SELECT ClientID, sum(Num_orders)
        FROM Orders O
        WHERE O.ClientID = @enteredClientID
        GROUP BY O.ClientID);
    
        -- Insert the orders into the results table --
        SELECT *
        FROM @Results;
    
    GO;
    

    一个称呼它:

    exec pOrders @enteredClientID = 'ABC123456789'
    

    或者干脆

    exec pOrders 'ABC123456789'
    

    【讨论】:

      【解决方案2】:

      --在存储过程中

      DECLARE @enteredClientID varchar(20) OUTPUT
      

      --然后插入并设置身份

      SELECT SCOPE_IDENTITY() AS @enteredClientID
      

      --调用过程时: -- DECLARE 变量保存返回值

      DECLARE @enteredClientID VARCHAR(20);
      

      --执行过程,返回值。

      EXEC @enteredClientID = pOrders
      

      【讨论】:

        【解决方案3】:

        试试 EXEC pOrders 'ABC123456789'。

        您提供的调用尝试执行该过程(不传递参数),然后尝试设置一个名为@enteredClientID 的变量。由于您没有在执行代码的范围内声明@enteredClientID,因此无法设置。

        有关如何在过程中使用参数的更多信息,这篇文章可能会有所帮助: http://msdn.microsoft.com/en-us/library/ms189915.aspx

        【讨论】:

        • 只是一个建议:使用表值函数而不是过程来满足这一需求可能是有意义的......但这超出了问题的范围:-)
        猜你喜欢
        • 1970-01-01
        • 2015-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-20
        • 2014-08-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多