如何从VBA ADODB中的参数化SQL Server查询诊断语法错误

des*_*uho 5 sql-server excel vba adodb

我正在使用VBA adodb INSERT基于Excel行内容在SQL Server中编写语句.

我正在使用参数化查询,因此我的VBA代码具有以下形式:

sqlStatement = "INSERT INTO dbo.mytable (" & Join(insertElement(0), ", ") & ") VALUES (" & Join(insertElement(2), ", ") & ")"
Set cm = New ADODB.Command

With cm
      Debug.Print (sqlStatement)
            .ActiveConnection = conn
            .CommandText = sqlStatement
            .CommandType = adCmdText
             For Each e In insertElement(1)
                Set Pm = .CreateParameter(, adVarChar, 3, 1024, e)
                .Parameters.Append Pm
             Next e
             Set rs = .Execute
        End With
Run Code Online (Sandbox Code Playgroud)

where insertElement(0)是一个字段名称数组,...(1)是一个值数组,而...(2)是一个?支持参数化的占位符数组

当我运行此代码时,我收到一个错误

[Microsoft] [SQL Server的ODBC驱动程序13] [SQL Server]'输出'附近的语法不正确

但是,当我询问sqlStatement文本时,语句中的任何地方都没有"输出".案文的格式如下:

INSERT INTO dbo.mytable ([my_field_1],[my_field_2],[somefieldshaveweirdcharslike+#], ...) VALUES (?, ?, ?, ...) 
Run Code Online (Sandbox Code Playgroud)

所以,如果我没有直接提供'Output'命令,并且我无法直接看到该语句,因为它正在服务器端进行处理,我该如何诊断语法?

des*_*uho 1

我在 SQL Server 中没有跟踪权限,因此探索服务器端日志记录的选项有限。

我最终用蛮力的方式解决了这个问题,一次添加一个字段,直到收到错误为止。

就我而言,根本问题与使用 adodbadNumeric参数类型作为十进制值有关。我将参数类型切换为adDecimal,然后在各个参数对象上设置NumericScale和值。Precisionvba 代码结构如下所示

            For Each p In paramArr
                If p(1) = adVarChar Then
                    Set Pm = .CreateParameter(, p(1), 1, Len(p(2)), p(2))
                Else
                    Set Pm = .CreateParameter(, p(1), 1, , p(2))
                End If
                If p(1) = adDecimal Then
                    Pm.NumericScale = 3
                    Pm.Precision = 13
                End If
                .Parameters.Append Pm
            Next p
Run Code Online (Sandbox Code Playgroud)