Поделиться через


Вызов хранимой процедуры

Применимо к: SQL Server Azure SQL DatabaseУправляемый экземпляр SQL AzureAzure Synapse AnalyticsAnalytics Platform System (PDW)

Драйвер SQL SERVER NATIVE CLIENT ODBC поддерживает escape-последовательность ODBC CALL и инструкцию Transact-SQLEXECUTE для выполнения хранимых процедур. Escape-последовательность ODBC CALL является предпочтительным методом. Использование синтаксиса ODBC позволяет приложению получать коды возврата хранимых процедур, а драйвер ODBC SQL Server Native Client также оптимизирован для использования протокола, изначально разработанного для отправки вызовов удаленных процедур (RPC) между компьютерами, на которых выполняется SQL Server. Этот протокол RPC повышает производительность, устраняя большую часть обработки параметров и синтаксической проверки инструкций на сервере.

Примечание

При вызове SQL Server хранимых процедур с помощью именованных параметров с ODBC (дополнительные сведения см. в разделе Привязка параметров по имени (именованные параметры)) имена параметров должны начинаться с символа @. Это ограничение, характерное для SQL Server. Драйвер ODBC SQL Server Native Client применяет это ограничение более строго, чем компоненты доступа к данным Майкрософт (MDAC).

Управляющая последовательность ODBC CALL для вызова процедуры такова:

{[?=]callprocedure_name[([parameter][,[parameter]]...)]}

где procedure_name задает имя процедуры, а параметр — параметр процедуры. Именованные параметры поддерживаются только в инструкциях, использующих escape-последовательности ODBC CALL.

Процедура может иметь параметры или не иметь их. Она также может возвращать значение (на что указывает необязательный маркер параметра «?=» в начале синтаксической конструкции). Если параметр является входным или входным-выходным, то может представлять собой литерал или маркер параметра. Если параметр является выходным, то должен быть маркером параметра, поскольку выходной параметр неизвестен. Маркеры параметров должны быть привязаны к SQLBindParameter перед выполнением инструкции вызова процедуры.

Входные и входные-выходные параметры в вызовах процедуры могут быть пропущены. Если процедура вызывается со скобками, но без параметров, то драйвер передает источнику данных указание, что для первого параметра должно использоваться значение по умолчанию. Пример:

{callprocedure_name( )}

Если процедура не имеет ни одного параметра, ее вызов завершается ошибкой. Если процедура вызывается без скобок, драйвер не передает какие-либо значения параметров. Пример:

{callprocedure_name}

В вызовах процедур можно задавать литералы для входных или входных-выходных параметров. Например, процедура InsertOrder имеет пять входных параметров. В следующем вызове процедуры InsertOrder пропущен первый параметр, указан литерал для второго параметра и используется маркер параметра для третьего, четвертого и пятого параметра. (Параметры нумеруются последовательно, начиная с 1.)

{call InsertOrder(, 10, ?, ?, ?)}  

Обратите внимание, что даже если параметр пропущен, запятая, отделяющая его от других параметров, должна присутствовать. Если пропущен входной или входной-выходной параметр, процедура использует значение по умолчанию. Другие способы задать значение по умолчанию для входного или входного-выходного параметра таковы: присвоить значение буфера длины и индикатора, привязанное к параметру процедуры SQL_DEFAULT_PARAM, или использовать ключевое слово DEFAULT.

Если входной-выходной параметр пропущен или в качестве параметра выступает литерал, то драйвер отбрасывает выходное значение. Аналогичным образом, если пропущен маркер параметра для значения, возвращаемого процедурой, драйвер отбрасывает возвращаемое значение. Наконец, если в приложении задан параметр возвращаемого значения для процедуры, которая не возвращает значение, драйвер задает значение буфера длины и индикатора, привязанное к параметру процедуры SQL_NULL_DATA.

Разделители в инструкциях CALL

Драйвер ODBC SQL Server Native Client по умолчанию также поддерживает параметр совместимости, характерный для escape-последовательности ODBC {CALL }. Он принимает инструкции CALL только с одним набором двойных кавычек, ограничивающих все имя хранимой процедуры:

{ CALL "master.dbo.sp_who" }  

По умолчанию драйвер ODBC SQL Server Native Client также принимает инструкции CALL, которые соответствуют правилам ISO, и заключают каждый идентификатор в двойные кавычки:

{ CALL "master"."dbo"."sp_who" }  

Однако при выполнении с параметрами по умолчанию драйвер ODBC SQL Server Native Client не поддерживает использование любой из форм идентификаторов в кавычках с идентификаторами, содержащими символы, не указанные в качестве допустимых в идентификаторах стандарта ISO. Например, драйвер не может получить доступ к хранимой процедуре с именем My.Proc с помощью инструкции CALL с идентификаторами в кавычках:

{ CALL "MyDB"."MyOwner"."My.Proc" }  

Эта инструкция интерпретируется драйвером следующим образом:

{ CALL MyDB.MyOwner.My.Proc }  

Сервер выдает ошибку о том, что связанный сервер с именем MyDB не существует.

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

{ CALL [MyDB].[MyOwner].[My.Table] }  

См. также:

Выполнение хранимых процедур