【发布时间】: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