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


Маркеры параметров (компонент Database Engine)

Маркеры параметров поддерживаются API-интерфейсами ADO, OLE DB и ODBC. Маркер параметра — это вопросительный знак (?), указанный вместо входного или выходного выражения в инструкции языка Transact-SQL. Маркеры параметров позволяют одной и той же инструкции Transact-SQL выполняться несколько раз с разными значениями входных и выходных параметров, позволяя производить их оптимизацию.

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

  • Подготовить следующую инструкцию Transact-SQL:

    EXEC GetQuoteProcedure @StockSymbolParameter = ?
    
  • Привязать переменную приложения к маркеру параметра (?).

  • Выполнить цикл:

    1. поместить код очередной ценной бумаги в привязанную переменную;

    2. выполнить инструкцию, чтобы получить котировку этой ценной бумаги.

Маркеры параметров не обязательно должны сопоставляться с параметрами хранимых процедур. Маркеры параметров можно использовать везде, где используется входное выражение, например:

UPDATE HumanResources.Employees
SET Title = ?
WHERE EmployeeID = ?

Маркеры параметров также могут применяться для сопоставления выходных параметров хранимых процедур и кодов возврата. Когда приложение выполняет хранимую процедуру, поставщик OLE DB или драйвер ODBC перемещает значения данных всех выходных параметров или кодов возврата в переменные, привязанные к маркерам параметров.

Например, приложение может выполнить следующую процедуру. Эта процедура возвращает целочисленный код возврата и символьный выходной параметр.

  1. Подготовить инструкцию:

    {? = CALL MyProc (?)}
    
  2. Привязать первый маркер параметра к целочисленной переменной, а второй — к массиву символов.

  3. Выполнить инструкцию.

  4. Выбрать или отменить все результирующие наборы, возвращенные хранимой процедурой.

Теперь поставщик OLE DB для Microsoft или драйвер ODBC SQL Server скопировал код возврата и значение выходного параметра в связанные переменные. Microsoft SQL Server возвращает значения выходного параметра и кода возврата в последнем пакете, передаваемом клиенту. Поэтому приложение должно обработать или отменить все результирующие наборы, возвращенные хранимой процедурой, до того, как она получит доступ к значениям кода возврата и выходного параметра.

API-интерфейс ADO выполняет хранимые процедуры похожим образом. Приложение ADO выполняет следующие действия:

  1. устанавливает тип объекта Command в значение adCmdStoredProc;

  2. устанавливает текст команды, содержащий только имя процедуры;

  3. строит коллекцию Parameters, привязывающую все параметры и коды возврата к переменным приложения;

  4. выполняет объект Command.

Маркеры параметров связаны с объектом базы данных, имеющих определенный тип. Если приложение связывает параметр маркера с переменной, тип данных которой отличен от типа связанного объекта базы данных, то поставщик OLE DB или драйвер ODBC должен произвести его преобразование. Например, если приложение привязывает целочисленный код возврата к массиву символов, то поставщик OLE DB или драйвер ODBC должен преобразовать целочисленные данные кода возврата в строку символов. Сведения о поддерживаемых преобразованиях типов данных см. в документации о поставщике OLE DB для SQL Server и драйвере SQL Server ODBC.