【问题标题】:Stored Procedures and Returning a Variable存储过程和返回变量
【发布时间】:2017-09-25 22:40:25
【问题描述】:

我编写了一个存储过程,在 SSMS 中执行时可以正常工作,但在代码中却不行。在代码中,我似乎不喜欢我试图返回一个变量。这会是什么原因?我尝试将output 添加到SELECT @soLineNumber 语句中,但这不起作用。

我得到的错误:在调试期间将鼠标悬停在记录集上时 - “在对应的集合中找不到该项目......”当我“观察”变量时,它只是说它是关闭。

ALTER PROCEDURE [dbo].[rt_sp_aof_loStart]
AS
BEGIN

DECLARE @soLineNumber varchar(50)

SELECT
    TOP 1 @soLineNumber = lQ.[SO_LINE_NUMBER]
FROM
    [ROBOTICS_OPTICS_MECHUAT].[dbo].[AOF_ORDER_LINE_QUEUE] AS lQ
    LEFT JOIN [ROBOTICS_OPTICS_MECHUAT].[dbo].[AOF_ORDER_QUEUE] AS oQ 
        ON oQ.[SALES_ORDER_NUMBER] = lQ.[SALES_ORDER_NUMBER]
WHERE
    lQ.[SELECTED] = 'False' AND
    lQ.[COMPLETED] = 'False'
ORDER BY
    lQ.[SELECTED] DESC,
    lQ.[COMPLETED] ASC

--

UPDATE
    [ROBOTICS_OPTICS_MECHUAT].[dbo].[AOF_ORDER_LINE_QUEUE]
SET
    [SELECTED] = 'True'
WHERE
    [SO_LINE_NUMBER] = @soLineNumber

--

SELECT @soLineNumber

END

运行一个简单的测试例程也会产生相同的结果。

Private Sub Button2_Released()

    errorPosition = "ThisDisplay.Button1 Test"
    On Error GoTo errorTrap
    Err.Clear

Button2.Enabled = True
    Set conn = New ADODB.Connection
    Set cmd = New ADODB.Command
    constr = "Provider=sqloledb;data source=i.p.add.ress;initial catalog=CATALOG;user id=user;password=pass"
    conn.Open constr
    With cmd
        .ActiveConnection = conn
        .CommandType = adCmdStoredProc
        .CommandText = "rt_sp_aof_loStart"
        .CommandTimeout = 2
    End With
    Set rst(1) = cmd.Execute()

    Do While Not rst(1).EOF
        MsgBox (rst(1)(0))
        rst(1).MoveNext
    Loop


    GoTo cleanExit

cleanExit:
    On Error Resume Next
    For i = 1 To 8
        If Not rst(i) Is Nothing Then
            rst(i).Close
        End If
    Next
    conn.Close

    Exit Sub

errorTrap:
    LogDiagnosticsMessage "_Eventwatcher2.gfx, Position: " & errorPosition & " , Error Code: [ " & Hex(Err.Number) & "], Description: " & Err.Description & ""
    Resume cleanExit

End Sub

【问题讨论】:

  • 实际错误是什么?
  • 另外,为什么你的存储过程硬编码了数据库和模式名称?如果您曾经重命名数据库,或将其部署到另一台服务器(使用不同的数据库名称),它将中断。
  • 如果您从存储过程中返回单个值,请考虑使用输出参数而不是 SELECT
  • @DougCoats 这是一个专有的 VBA,所以我不会发疯并发布整个过程,但这是非常标准的,我以前没有遇到过这个问题。 DIM recordSet as ADODB.RecordSet cmd.CommandType = adCmdStoredProc cmd.CommandText = "rt_sp_aof_loStart" set RecordSet = cmd.execute.
  • 您是否尝试在存储过程中添加set nocount on 作为第一条语句。

标签: sql sql-server vba sql-server-2008


【解决方案1】:

我最终使用OUTPUT 参数来解决这个问题。

AS 语句上方的声明移至参数化。添加了OUTPUT。从 SP 底部删除了SELECT @soLineNumber

ALTER PROCEDURE [dbo].[rt_sp_aof_loStart]
@soLineNumber varchar(50) OUTPUT
AS
BEGIN
SET NOCOUNT ON

SELECT
    TOP 1 @soLineNumber = lQ.[SO_LINE_NUMBER]
FROM
    [ROBOTICS_OPTICS_MECHUAT].[dbo].[AOF_ORDER_LINE_QUEUE] AS lQ
    LEFT JOIN [ROBOTICS_OPTICS_MECHUAT].[dbo].[AOF_ORDER_QUEUE] AS oQ 
        ON oQ.[SALES_ORDER_NUMBER] = lQ.[SALES_ORDER_NUMBER]
WHERE
    lQ.[SELECTED] = 'False' AND
    lQ.[COMPLETED] = 'False'
ORDER BY
    lQ.[SELECTED] DESC,
    lQ.[COMPLETED] ASC

--

UPDATE
    [ROBOTICS_OPTICS_MECHUAT].[dbo].[AOF_ORDER_LINE_QUEUE]
SET
    [SELECTED] = 'True'
WHERE
    [SO_LINE_NUMBER] = @soLineNumber

--

END

我的 VB 测试代码将参数输出为 msgbox。当您在 SP 和 VBA 中指定多个参数时,这适用于多个参数。新增.Parameters.Append cmd.CreateParameter("@soLineNumber", adVarChar, adParamOutput, 50),cmd.execute后引用cmd.Parameters("@soLineNumber").Value

Private Sub Button2_Released()

    errorPosition = "ThisDisplay.Button1 Test"
    On Error GoTo errorTrap
    Err.Clear

    Button2.Enabled = True
    Set conn = New ADODB.Connection
    Set cmd = New ADODB.Command
    constr = "Provider=sqloledb;data source=i.p.add.ress;initial catalog=catalog;user id=user;password=pass"
    conn.Open constr

    With cmd
        .ActiveConnection = conn
        .CommandType = adCmdStoredProc
        .CommandText = "rt_sp_aof_loStart"
        .CommandTimeout = 2
        .Parameters.Append cmd.CreateParameter("@soLineNumber", adVarChar, adParamOutput, 50)
        .Execute
    End With

    MsgBox cmd.Parameters("@soLineNumber").Value

    GoTo cleanExit

cleanExit:
    On Error Resume Next
    conn.Close

    Exit Sub

errorTrap:
    LogDiagnosticsMessage "_Eventwatcher2.gfx, Position: " & errorPosition & " , Error Code: [ " & Hex(Err.Number) & "], Description: " & Err.Description & ""
    Resume cleanExit

End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-18
    • 2014-04-18
    • 2012-11-29
    • 1970-01-01
    • 2013-04-05
    • 2017-05-12
    • 1970-01-01
    • 2021-09-04
    相关资源
    最近更新 更多