【发布时间】:2015-09-30 13:42:31
【问题描述】:
ALTER PROCEDURE [dbo].[SP_Hello]
@portfolio nvarchar(5),
@discount numeric(18,2),
@lowerlimit numeric(18,2),
@midlimit numeric(18,2)
AS
BEGIN
SET NOCOUNT ON;
SELECT distinct
EntityDescription,
d.AmountDueInCurr * @discount as [1st part],
d.AmountDueInCurr * (1 - @discount) as [2nd Part],
CASE WHEN d.AmountDueInCurr <= 0 THEN 'Solution 1'
WHEN d.AmountDueInCurr between 0 and @lowerlimit THEN 'Solution 2'
WHEN d.AmountDueInCurr between (@lowerlimit + 0.01) and @midlimit THEN CONCAT(@portfolio, '-01')
WHEN d.AmountDueInCurr > (@midlimit+0.01) THEN CONCAT(@portfolio, '-02')
ELSE 'Error'
END AS Solution_type
FROM
T1 d
我想从 Excel 传递参数,使用 VBA 作为这个:
Private Sub CommandButton1_Click()
Dim Portfolio As String
Dim Discount As Single
Dim lowerlimit As Single
Dim midlimit As Single
Portfolio = Sheets("Input").Range("B2").Value
Popust = Sheets("Input").Range("B3").Value
lowerlimit = Sheets("Input").Range("B4").Value
midlimit = Sheets("Input").Range("B5").Value
With ActiveWorkbook.Connections("Hello_data").OLEDBConnection
.CommandText = "exec SP_Hello '" & Portfolio & "','" & Discount & "','" & lowerlimit & "','" & midlimit & "'"
ActiveWorkbook.Connections("Hello_data").Refresh
End With
Worksheets(2).Activate
End Sub
似乎无论我做什么(格式化、声明或调暗变量/参数),我总是在 Excel 中遇到转换数据类型错误。我已经在 Excel 中尝试了从 String 到 Double 的所有方法,以及 SQL 中的所有数字组合,但似乎没有一种组合有效。
如果我只传递数据库中的 nvarchar 的 Portfolio 参数(字符串),它会顺利进行。只要我将数字或日期添加到组合中,就会出现转换错误。
【问题讨论】:
-
尝试将所有 proc 参数设为 nvarchar,并根据需要在 proc 代码中进行转换。
-
旁注:您应该不为您的存储过程使用
sp_前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实会在未来某个时候冒着名称冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免sp_并使用其他东西作为前缀 - 或者根本不使用前缀! -
正如 Tab Alleman 所说,您可以将 sp 中的所有参数转换为 nvarchar,或者您需要在代码中将其转换为双精度/十进制。
-
我已经尝试了建议的... 将excel中的所有变量作为字符串,格式化单元格作为工作表中的文本,并将SQL中的参数声明为nvarchar。我仍然收到“将 nvarchar 转换为数字的错误”错误。这可能是代码执行的错误,它会因为我在计算步骤中使用 nvarchar 而中断吗?
-
对于数字类型,命令应该类似于“exec SP_Hello 'Portfolio Name as Text',112.45,123.45,123.45”。如您所见,数字周围没有“ ”。所以尝试使用数字类型和
.CommandText = "exec SP_Hello '" & Portfolio & "'," & Str(Discount) & "," & Str(lowerlimit) & "," & Str(midlimit) & ""
标签: sql-server excel vba