Sybase"具有多个SET的主机变量值不够"

xin*_*nux 2 c# sybase odbc sqlanywhere

当执行具有多个用于SET局部变量的参数的查询时,我收到此错误:

iAnywhere.Data.SQLAnywhere.SAException(0x80004005):主机变量的值不足

我使用OdbcConnection或SAConnection得到相同的错误.

var connection = new SAConnection(connectionString);
connection.Open();
var transaction = connection.BeginTransaction();

string sql = @"
DECLARE @A int
DECLARE @B int
SET @A = ?
SET @B = ?
";

var command = new SACommand(sql, connection, transaction);

var param1 = new SAParameter();
param1.Value = 1;
command.Parameters.Add(param1);

var param2 = new SAParameter();
param2.Value = 2;
command.Parameters.Add(param2);

command.ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud)

如果只有一个参数,查询执行正常:

DECLARE @A int
DECLARE @B int
SET @A = ?
SET @B = 42
Run Code Online (Sandbox Code Playgroud)

我在Sybase Anywhere 12.0.1.3942服务器上运行它.

更新:经过更多测试后,我注意到当我在同一个查询中有多个参数化语句时会发生这种情况.这也给出了错误:

SELECT ?
SELECT ?
Run Code Online (Sandbox Code Playgroud)

xin*_*nux 5

SA数据库引擎中显然存在一些令人讨厌的限制:

批量内允许主机变量引用具有以下限制:

  • 批处理中只有一个语句可以引用主机变量
  • 使用主机变量的语句不能在返回结果集的语句之前

一个可能的解决办法是选择 ING所有主机变量(参数) 本地变量在一个声明中使用它们之前:

BEGIN
    DECLARE @id INT;
    DECLARE @name NVARCHAR;
    DECLARE @comment NCARCHAR;
    SELECT :id, :name, :comment INTO @id, @name, @comment;
END;
Run Code Online (Sandbox Code Playgroud)