我有这个小代码示例,我在其中调用一个过程,它有 4 个参数:
DECLARE @tmp BIT
SET @tmp = 0
IF @tmp = 1
call __insert_to_notifications_table('foo', '1234', '5678', 'Some comment')
ELSE
print 'Path, which is choosen'
运行这个时,我得到
Syntaxerror at 'call' in line 4
SQLCODE=-131, ODBC 3-Status="42000"
如果我跑
call __insert_to_notifications_table('foo', '1234', '5678', 'Some comment')
直接,它工作正常。(该过程实际上是在开头用双 __ 调用的;重命名时也不起作用)
当运行这样的代码时:
DECLARE @tmp BIT
SET @tmp = 0
IF @tmp = 1
print 'other path'
ELSE
print 'Path, which is choosen'
它似乎工作。所以我会把这个问题归结为电话。
我在这里做错了什么?
我认为这是由于 Watcom-SQL 和 T-SQL 语法之间的混淆造成的。
因为您在第一个示例中使用了 CALL(而不是 EXEC),所以数据库引擎将假定代码在 Watcom SQL 中。(稍后有 PRINT 声明,但决定将在此之前做出)。
在第二个示例中,命令 PRINT 仅在 T-SQL 中有效,并且整个代码段都是有效的 T-SQL,因此数据库引擎将假定所有代码都是 T-SQL,并且不需要 THEN。
如果我是对的,那么这应该可以工作(在 Watcom-SQL 中未经测试):
有关 SQL Anywhere 对各种 SQL 方言的支持差异,请参见:http ://dcx.sybase.com/index.html#1200/en/dbusage/ug-sql-compat.html
更新 - 此批处理在 dbISQL 中运行良好:
(我添加了 BEGIN 和 END 来为 DECLARE 提供上下文并使用内置过程而不是用户定义的过程)在 10.0.1.4310 和 16.0.0.1535 中测试。如果我省略了 THEN 我会得到与你得到的相同的错误。
纯 T-SQL 版本是:
它也适用于 10.0.1.4310 和 16.0.0.1535。不要忘记,如果您使用 T-SQL EXEC,则必须单独指定参数(不在括号中):