Я хочу вызвать хранимую процедуру в базе данных SQL Server 2022 со строковым выходным параметром, используя API ODBC. Числовые выходные параметры работают нормально, но строковые я не могу заставить работать.
Хранимая процедура:
CREATE PROCEDURE TestStoredProcedure(@inParam VARCHAR(MAX), @outParam VARCHAR(MAX) OUTPUT) AS
BEGIN
SET @outParam = @inParam;
END;
Фрагмент кода приложения (проверка ошибок опущена):
char* pStr = "{call TestStoredProcedure(?, ?)}";
SQLPrepare(hstmt, pStr, (SQLINTEGER)strlen(pStr));
char inParam[10] = "1234";
char outParam[10] = "";
SQLBindParameter(hstmt,
(SQLUSMALLINT)1,
SQL_PARAM_INPUT,
SQL_C_CHAR,
SQL_LONGVARCHAR,
(SQLUINTEGER)strlen(inParam),
0,
(SQLPOINTER)inParam,
sizeof(inParam),
0);
SQLBindParameter(hstmt,
(SQLUSMALLINT)2,
SQL_PARAM_OUTPUT,
SQL_C_CHAR,
SQL_LONGVARCHAR,
(SQLUINTEGER)sizeof(outParam),
0,
(SQLPOINTER)outParam,
sizeof(outParam),
0);
SQLExecute(hstmt); // error
Ошибка:
[Microsoft][Драйвер ODBC 18 для SQL Server][SQL Server]Недопустимый параметр 4 (''): Данные тип 0x23 — устаревший большой объект или LOB, но помечен как выходной параметр. Устаревшие типы не поддерживаются в качестве выходных параметров. Вместо этого используйте текущие типы больших объектов.
Я пробовал с VARCHAR(5), CHAR(5), NVARCHAR(MAX), но ничего не помогает.
Какими должны быть типы параметров, чтобы это работало, и что такое Invalid parameter 4 ('')?
В качестве примечания: действительно ли вероятно, что ваши входные и выходные значения будут больше 8000 байт? Если нет, то рассмотрите возможность использования более репрезентативной длины для ваших параметров вместо MAX.
@ThomA, как указано в вопросе, я пробовал использовать VARCHAR(5) и CHAR(5), но получаю ту же ошибку, что бы я ни делал.
Когда/где вы пробовали varchar(5) и в определении SP, и в привязке одновременно? Тип данных 0x23 — text, это устаревший тип данных.
@ThomA изменение SQL_LONGVARCHAR на SQL_VARCHAR, похоже, работает для VARCHAR (5).
SQL_VARCHAR работает и для VARCHAR(MAX), поэтому, очевидно, основная проблема заключается в SQL_LONGVARCHAR.
Я не могу найти документацию по нему, но подозреваю, что SQL_LONGVARCHAR соответствует text, поэтому вы и получили ошибку. Я подозреваю, что SQL_WLONGVARCHAR и SQL_LONGVARBINARY также сопоставляются с ntext и image соответственно (которые также устарели).
Вероятно, эта часть документации актуальна.





Выходной символ должен быть SQL_VARCHAR, а не SQL_LONGVARCHAR:
SQLBindParameter(hstmt,
(SQLUSMALLINT)2,
SQL_PARAM_OUTPUT,
SQL_C_CHAR,
SQL_VARCHAR,
(SQLUINTEGER)sizeof(outParam),
0,
(SQLPOINTER)outParam,
sizeof(outParam),
0);
Использование
SQL_SS_LENGTH_UNLIMITEDв качестве значения параметраColumnSizeможет помочь.