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;