2

在 MS Excel 中,如果您使用 Microsoft Query 创建 QueryTable,并且您的 SQL 查询无法通过 Microsoft Query 直观呈现,则不允许为该查询提供参数。真可惜,所以有一种很棒的技术可以允许参数:

{CALL sp_executesql (N'select top (@a) * from mytable', N'@a int', ?)}

您以 ODBCCALL形式提供查询,它使用参数。

除非它没有。

虽然在某些计算机上它可以完美运行,但在其他计算机上,Excel 在尝试刷新查询表时会引发错误:

  • 对于 SQL Native Client 10:Invalid parameter number
  • 对于 SQL Native Client 11:Procedure or function sp_executesql has too many arguments specified.

使用分析器,我可以看到 Excel(实际上是被 Excel 戳的本机客户端)在实际执行之前正在执行此操作sp_executesql

exec sp_describe_undeclared_parameters N' EXEC sp_executesql N''<actual query>;'',N''<declared parameters>'',@P1  '

@p1是应该sp_executesql稍后使用的参数占位符,这就是sp_describe_undeclared_parameters失败的地方。它不期望任何自定义参数sp_executesql- 只有两个内在参数@stmt@params. 如果我从查询中手动删除该,@p1位,它在所有情况下都可以正常执行。

这就是问题所在:在某些计算机上,上述自动生成的内容sp_describe_undeclared_parameters与不必要/错误的,@P1位一起使用,而在某些计算机上却失败了。
我们需要让它在所有计算机上工作。

奇怪的事情要考虑:

  • 在没有问题的计算机中,我看不到任何常见的东西。位数或 Windows 版本似乎无关紧要。
  • 我无法在附加位的情况下手动执行上述查询,@P1- 无论我使用什么工具,我都会收到“参数过多”错误,但是,Excel 能够在感觉时执行它没有问题。我可以通过探查器看到命中服务器的确切查询。也许它与连接设置的一个非常特殊的组合有关,但它们在所有计算机上似乎都是相同的(数据源是使用 SQL Server Native Client 11 的 ODBC 系统数据源,并且所有选项卡上的所有参数都相同)计算机)。
4

0 回答 0