【问题标题】:Passing parameters from Excel to SQL将参数从 Excel 传递到 SQL
【发布时间】: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 '" &amp; Portfolio &amp; "'," &amp; Str(Discount) &amp; "," &amp; Str(lowerlimit) &amp; "," &amp; Str(midlimit) &amp; ""

标签: sql-server excel vba


【解决方案1】:

您的存储过程参数定义了数字数据类型,但您构建的 TSQL 字符串是在字符串中传递的。您需要删除在参数@discount@lowerlimit@midlimit 周围放置的单引号。

要查看问题,只需添加以下代码:

Dim tsql As String
tsql = "exec SP_Hello '" & Portfolio & "','" & Discount & "','" & lowerlimit & "','" & midlimit & "'"

打印出 tsql,并在 SSMS 中执行。您应该会立即看到问题。

【讨论】:

    猜你喜欢
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    • 2014-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多