【发布时间】:2014-12-12 13:58:10
【问题描述】:
以下 SQL 在 Sybase ASE 和 MS SQL Server 中编译没有问题:
go
create proc foo
@foo1 int
as
select @foo1
go
create proc bar
@bar1 int
as
exec foo @foo1=@bar1, @foo2=@bar1
go
它在 Sybase ASE 中运行没有问题,但在 MS SQL Server 中抱怨:
Msg 8144, Level 16, State 2, Procedure foo, Line 11
Procedure or function foo has too many arguments specified.
是否可以告诉 MS SQL Server 忽略此警告?如果没有,是否可以在编译调用具有太多参数的其他过程的存储过程时告诉 MS SQL Server 中断?当我们只在实际调用过程时才知道这些问题时,这是有潜在危险的。
这段代码应该在 Sybase ASE 和 MS SQL Server 中都可以工作,到目前为止,我们一直在使用 Sybase 的宽松规则,因为我们现在正在添加对 MS SQL Server 的支持。
正如我在下面提到的,问题不在于可选参数。它是关于存储过程的预测。我不介意仅通过使用正确数量的参数调用存储过程或向存储过程添加虚拟参数来解决问题,我只希望 MS SQL Server 在编译时告诉我,而不是在运行时告诉我。既然 MS SQL Server 实际上会验证一个过程是否存在(如果不存在它会发出警告,尽管我更喜欢它像 Sybase ASE 那样失败),为什么它不能同时检查它的参数呢?
【问题讨论】:
-
您只需要指定例如两个参数,其中一个是可选的。 stackoverflow.com/questions/1810638/…
-
"为什么不能检查..." 可以,但不能。不幸的是deferred name resolution 被认为是一个特性而不是一个错误。只有在执行时 SQL Server 才会尝试生成查询计划,然后才会看到调用无效。收到警告是一种礼貌。
-
嗯,那么这个转换会很有趣。
标签: sql sql-server sap-ase