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