如何使Excel从工作表的查询表中可靠地执行sp_executesql?

在MS Excel中,如果使用Microsoft Query创build一个QueryTable,并且您的SQL查询不能通过Microsoft Query进行可视化呈现,则不允许为该查询提供参数。 这是一个耻辱,所以有这个令人敬畏的技术 ,无论如何允许参数:

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

您在ODBC CALL窗体中提供查询,并且它可以使用参数。

除非没有。

在某些计算机上,它完美地工作,在其他计算机上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位一起工作,在某些计算机上失败。
我们需要使它在所有的计算机上工作。

奇怪的事情要考虑:

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