Sybase "Недостаточно значений для переменных хоста" с несколькими наборами

При выполнении запроса с более чем одним параметром, используемым для установки локальных переменных, я получаю эту ошибку:

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();

Запрос выполняется нормально, если есть только один параметр:

DECLARE @A int
DECLARE @B int
SET @A = ?
SET @B = 42

Я запускаю это на сервере Sybase Anywhere 12.0.1.3942.

Обновление: после дополнительного тестирования я замечаю, что это происходит, когда у меня есть более одного параметризованного оператора в одном запросе. Это также дает ошибку:

SELECT ?
SELECT ?

1 ответ

Решение

Очевидно, существуют некоторые неприятные ограничения в ядре базы данных SA:

Ссылки на переменные хоста разрешены в пакетах со следующими ограничениями:

  • только один оператор в пакете может ссылаться на переменные хоста
  • оператору, который использует переменные хоста, не может предшествовать оператор, который возвращает набор результатов

Один из возможных обходных путей - это выбрать все переменные хоста (параметры) в локальные переменные одним оператором перед их использованием:

BEGIN
    DECLARE @id INT;
    DECLARE @name NVARCHAR;
    DECLARE @comment NCARCHAR;
    SELECT :id, :name, :comment INTO @id, @name, @comment;
END;
Другие вопросы по тегам