【问题标题】:Stored procedure called in VBA keeps going to default value for a parameterVBA中调用的存储过程保持参数的默认值
【发布时间】:2016-02-05 18:22:10
【问题描述】:

我有一个从 Excel 调用的存储过程。其中一个参数是浮点数,它似乎无法访问 SQL Server。服务器中的结果很好,当我在 VBA 中对查询进行硬编码时。我在 SQL Server 探查器中对其进行了跟踪,它传入了默认的 null aka 用户未指定。这里会发生什么?

存储过程:

CREATE PROCEDURE um.topStudents
    @semesterStart datetime, 
    @semesterEnd datetime,
    @SchoolID AS char(10) = null,
    @gradeThreshold AS float = null
AS
BEGIN
    SELECT TOP 20 
        sc.schoolname AS School, 
        sd.Last, sd.First, sd.SSN, sd.DOB
    FROM 
        dbo.StudentRecords sr
    INNER JOIN 
        dbo.lkpmajor mj ON r.major = mj.code
    INNER JOIN 
        dbo.tblstudDemo sd ON sr.SchoolID = sd.schoolid AND r.SSN = sd.SSN
    INNER JOIN 
        dbo.tblschools sc ON sr.SchoolID = sc.code
    WHERE 
        r.StartDate between @semesterStart AND @semesterEnd 
        AND ((sr.SchoolID = @SchoolID ) OR (@SchoolID IS NULL))
        AND sr.major = '03' 
        AND sr.program = 'scholarship'
        AND ((sr.grade>@gradeThreshold ) OR ((@gradeThreshold IS NULL) AND (gradeThreshold >=3.0)))
    ORDER BY 
        sr.grade DESC;
END

VBA:

Private Sub topStudents_Grades_Thres(semesterstart As String, semesterend As String, Optional ByVal gradethreshold As Double)
   'New ADODB Connection
    ....
    'New ADODB Command

    'With ADODB Command
        'use connection
        'open stored procedure
        .Parameters.Append cm_TopStud.CreateParameter("@semesterStart", adChar, adParamInput, 8, semesterstart )
        .Parameters.Append cm_TopStud.CreateParameter("@semesterEnd ", adChar, adParamInput, 8, semesterend)
        .Parameters.Append cm_TopStud.CreateParameter("@gradeThreshold", adDouble, adParamInput, gradethreshold)
        .CommandTimeout = 300
    End With

    'Open command with recordset 
    'Set range & copy from recordset

    'Close recordset & connection
End Sub

Call topStudents_Grades_Thres("20150701", "20160204", 2.75)

更新:试图找出参数不通过 SQL Server 的原因:

CREATE PROCEDURE [UM].[usp_Test]
   @intParameter as int = null
as
BEGIN
    IF (@intParameter IS NULL)
      SELECT 1 + 0 AS [Test]
    ELSE
      SELECT 1 + @intParameter AS [Test]
END

未通过的号码:

Private Sub TestSub(Optional ByVal num As Integer)
   ....
   .Parameters.Append cm_numTest.CreateParameter("@intParameter", adInteger, adParamInput, num)
   ....
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
   Dim num As Integer
   num = CInt(Worksheets("Sheet1").Range("D1"))
   If ActiveCell.Address = "$A$1" Then
    Call TestSub(num)
   End If
End Sub

【问题讨论】:

  • 看例子,你可能不应该在参数名称中包含@
  • 喜欢:.Parameters.Append cm_TopStud.CreateParameter("gradeThreshold", adDouble, adParamInput,gradethreshold)
  • 我看到您的 SP 中引用了 @ProvID,但未定义为参数。
  • 这到底是什么.....应该是@SchoolID,也许浏览器没有通过之前对帖子的更改
  • 您将日期作为字符串传递。开始日期是如何定义的?如果它被定义为罪魁祸首的日期/时间-您要么想将日期转换为日期/时间,要么我认为将日期字符串发送为“#”+学期开始+“#”等将起作用.

标签: sql-server vba excel stored-procedures


【解决方案1】:

您的 VBA 代码仅发送 3 个值(semesterStart、semesterEnd、gradeThreshold)作为 SQL 过程输入参数。 SQL 过程需要 4 个输入参数;但是,缺少的输入参数 (SchoolID) 在 SQL 过程中被定义为默认 NULL。

您必须为 SchoolID 添加“.Parameters.Append cm_TopStud.CreateParameter(...)”到您的 VBA,并将 [Call topStudents_Grades_Thres("20150701", "20160204", 2.75)] 修改为 [调用 topStudents_Grades_Thres("20150701", "20160204", "123456", 2.75)],假设“123456”是学校 ID。

【讨论】:

  • SchoolID 和gradeThreshold 应该是可选参数。在 sql server 中,我可以运行存储过程,没有提供 schoolID,只提供gradeThreshold,并获得正确的结果。由于某种原因不在 VBA 中,gradeThreshold 没有进行过滤。
  • 好的,有一个参数工作了,现在我来看看日期参数。我使用了 param_Test.Value = testInt ! :)
【解决方案2】:

谢谢!我让它工作了!更改为正确的数据类型,并从此更改创建附加参数行:

.Parameters.Append cm_TopStud.CreateParameter("@semesterStart", adChar, adParamInput, 8,
 semesterstart )

到这里:

Dim param_semesterStart As ADODB.Parameter
Set param_semesterStart = New ADODB.Parameter

With cm_TopStud
    ....
    Set param_semesterStart= .CreateParameter("@semesterStart", adDBDate, adParamInput)
    param_semesterStart.Value = semesterstart
    .Parameters.Append param_semesterStart
    ....
End With

加入“黑客帝国”也有帮助:P

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-06
    • 2018-05-09
    • 2013-10-03
    • 2011-11-02
    • 2016-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多