如何使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系统数据源,并且所有参数在所有选项卡上都是相同的计算机)。