Вызов хранимой процедуры
При выполнении хранимых процедур драйвер ODBC для собственного клиента SQL Server поддерживает и escape-последовательность ODBC CALL, и инструкцию Transact-SQL EXECUTE. Предпочтительным методом является управляющая последовательность ODBC CALL. Использование синтаксиса ODBC позволяет приложению получать коды возврата хранимых процедур, а драйвер ODBC для собственного клиента SQL Server оптимизирован в целях использования протокола, первоначально разработанного для отправки вызовов удаленных процедур (RPC) между компьютерами, на которых выполняется SQL Server. Этот протокол RPC повышает производительность, устраняя большую часть обработки параметров и синтаксической проверки инструкций на сервере.
Примечание |
---|
При вызове хранимых процедур SQL Server с именованными параметрами в ODBC (дополнительные сведения см. в разделе Привязка параметров по имени (именованные параметры)) имена параметров должны начинаться со знака @. Это ограничение, характерное для SQL Server. В драйвере ODBC для собственного клиента SQL Server это ограничение контролируется строже, чем в компонентах доступа к данным MDAC. |
Управляющая последовательность ODBC CALL для вызова процедуры такова:
{[?=]call имя_процедуры[([параметр][,[параметр]]...)]}
где имя_процедуры задает имя процедуры, а параметр указывает параметр процедуры. Именованные параметры поддерживаются только в инструкциях, использующих escape-последовательности ODBC CALL.
Процедура может иметь от нуля и больше параметров. Она может также возвращать значение (на что указывает необязательный маркер параметра «?=» в начале синтаксической конструкции). Если параметр является входным или входным-выходным, то может представлять собой литерал или маркер параметра. Если параметр является выходным, то должен быть маркером параметра, поскольку выходной параметр неизвестен. Для маркеров параметров необходимо выполнить привязку с помощью метода SQLBindParameter до выполнения инструкции по вызову процедуры.
Входные и входные-выходные параметры в вызовах процедуры могут быть пропущены. Если процедура вызывается со скобками, но без параметров, то драйвер передает источнику данных указание, что для первого параметра должно использоваться значение по умолчанию. Например:
{call имя_процедуры**( )**}
Если процедура не имеет ни одного параметра, ее вызов завершается ошибкой. Если процедура вызывается без скобок, драйвер не передает какие-либо значения параметров. Например:
{call имя_процедуры}
В вызовах процедур можно задавать литералы для входных или входных-выходных параметров. Например, процедура InsertOrder имеет пять входных параметров. В следующем вызове процедуры InsertOrder пропущен первый параметр, указан литерал для второго параметра и используется маркер параметра для третьего, четвертого и пятого параметра. (Параметры нумеруются последовательно, начиная с 1.)
{call InsertOrder(, 10, ?, ?, ?)}
Обратите внимание, что даже если параметр пропущен, запятая, отделяющая его от других параметров, должна присутствовать. Если пропущен входной или входной-выходной параметр, процедура использует значение по умолчанию. Другие способы задать значение по умолчанию для входного или входного-выходного параметра таковы: присвоить значение буфера длины и индикатора, привязанное к параметру процедуры SQL_DEFAULT_PARAM, или использовать ключевое слово DEFAULT.
Если входной-выходной параметр пропущен или в качестве параметра выступает литерал, то драйвер отбрасывает выходное значение. Аналогичным образом, если пропущен маркер параметра для значения, возвращаемого процедурой, драйвер отбрасывает возвращаемое значение. Наконец, если в приложении задан параметр возвращаемого значения для процедуры, которая не возвращает значение, драйвер задает значение буфера длины и индикатора, привязанное к параметру процедуры SQL_NULL_DATA.
Разделители в инструкциях CALL
Драйвер ODBC для собственного клиента SQL Server по умолчанию поддерживает также параметр совместимости для управляющей последовательности ODBC { CALL }. Он принимает инструкции CALL только с одним набором двойных кавычек, ограничивающих все имя хранимой процедуры:
{ CALL "master.dbo.sp_who" }
По умолчанию драйвер ODBC для собственного клиента SQL Server принимает также инструкции CALL, которые соответствуют правилам ISO, и заключает каждый идентификатор в двойные кавычки:
{ CALL "master"."dbo"."sp_who" }
Но при выполнении с настройками по умолчанию драйвер ODBC для собственного клиента SQL Server не поддерживает использование ни одной из форм представления идентификаторов, заключенных в кавычки, применительно к идентификаторам, которые содержат символы, не указанные как допустимые в стандарте ISO. Например, драйвер не может получить доступ к хранимой процедуре с именем "My.Proc" с помощью инструкции CALL с заключенными в кавычки идентификаторами:
{ CALL "MyDB"."MyOwner"."My.Proc" }
Эта инструкция интерпретируется драйвером следующим образом:
{ CALL MyDB.MyOwner.My.Proc }
Сервер активизирует ошибку, которая указывает, что связанный сервер с именем MyDB не существует.
При использовании идентификаторов, заключенных в квадратные скобки, эта инструкция интерпретируется правильно:
{ CALL [MyDB].[MyOwner].[My.Table] }