Вызов хранимой процедуры
Применимо: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure azure Synapse Analytics Analytics Platform System (PDW)
Драйвер ODBC собственного клиента SQL Server поддерживает escape-последовательность ODBC CALL и инструкцию Transact-SQLEXECUTE для выполнения хранимых процедур. Escape-последовательность ВЫЗОВОВ ODBC является предпочтительным методом. Использование синтаксиса ODBC позволяет приложению получать коды возврата хранимых процедур и драйвер ODBC собственного клиента SQL Server также оптимизирован для использования протокола, первоначально разработанного для отправки вызовов удаленной процедуры (RPC) между компьютерами под управлением SQL Server. Этот протокол RPC повышает производительность, устраняя большую часть обработки параметров и синтаксической проверки инструкций на сервере.
Примечание.
При вызове хранимых процедур SQL Server с помощью именованных параметров с ODBC (дополнительные сведения см. в разделе "Параметры привязки по имени" (именованные параметры)) имена параметров должны начинаться с символа @. Это определенное ограничение SQL Server. Драйвер ODBC собственного клиента SQL Server применяет это ограничение более строго, чем компоненты Microsoft Data Access (MDAC).
Управляющая последовательность ODBC CALL для вызова процедуры такова:
{[?=]callprocedure_name[([параметр][,[параметр]...)]}
где procedure_name указывает имя процедуры и параметра , указывающее параметр процедуры. Именованные параметры поддерживаются только в инструкциях, использующих escape-последовательности ODBC CALL.
Процедура может иметь параметры или не иметь их. Она также может возвращать значение (на что указывает необязательный маркер параметра «?=» в начале синтаксической конструкции). Если параметр является входным или входным-выходным, то может представлять собой литерал или маркер параметра. Если параметр является выходным, то должен быть маркером параметра, поскольку выходной параметр неизвестен. Маркеры параметров должны быть привязаны к SQLBindParameter перед выполнением инструкции вызова процедуры.
Входные и входные-выходные параметры в вызовах процедуры могут быть пропущены. Если процедура вызывается со скобками, но без параметров, то драйвер передает источнику данных указание, что для первого параметра должно использоваться значение по умолчанию. Например:
{call procedure_name( )}
Если процедура не имеет ни одного параметра, ее вызов завершается ошибкой. Если процедура вызывается без скобок, драйвер не передает какие-либо значения параметров. Например:
{call procedure_name}
В вызовах процедур можно задавать литералы для входных или входных-выходных параметров. Например, процедура InsertOrder имеет пять входных параметров. В следующем вызове процедуры InsertOrder пропущен первый параметр, указан литерал для второго параметра и используется маркер параметра для третьего, четвертого и пятого параметра. (Параметры нумеруются последовательно, начиная с 1.)
{call InsertOrder(, 10, ?, ?, ?)}
Обратите внимание, что даже если параметр пропущен, запятая, отделяющая его от других параметров, должна присутствовать. Если пропущен входной или входной-выходной параметр, процедура использует значение по умолчанию. Другие способы задать значение по умолчанию для входного или входного-выходного параметра таковы: присвоить значение буфера длины и индикатора, привязанное к параметру процедуры SQL_DEFAULT_PARAM, или использовать ключевое слово DEFAULT.
Если входной-выходной параметр пропущен или в качестве параметра выступает литерал, то драйвер отбрасывает выходное значение. Аналогичным образом, если пропущен маркер параметра для значения, возвращаемого процедурой, драйвер отбрасывает возвращаемое значение. Наконец, если в приложении задан параметр возвращаемого значения для процедуры, которая не возвращает значение, драйвер задает значение буфера длины и индикатора, привязанное к параметру процедуры SQL_NULL_DATA.
Разделители в инструкциях CALL
Драйвер ODBC собственного клиента SQL Server по умолчанию также поддерживает параметр совместимости, характерный для escape-последовательности 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] }