Почему вызову хранимой процедуры всегда предшествует вызов sp_sproc_columns? - PullRequest
3 голосов
/ 16 сентября 2011

Я унаследовал классический asp-сайт, который использует объекты ADO Db Command для хранимых процедур.

Одна из вещей, которые я заметил в профилировщике sql, заключается в том, что для каждого вызова хранимых процедурВ процедуре также есть вызов sp_sproc_columns.Как я могу предотвратить этот вызов?

Код, используемый для вызова хранимых процедур, имеет следующий вид:

Dim objCmd
Set objCmd = server.CreateObject("adodb.command")
objCmd.ActiveConnection = oConn 'scoped globally
objCmd.CommandType = adCmdStoredProc
objCmd.CommandText = "dbname.dbo.sprocName"

objCmd.Parameters.Append objCmd.CreateParameter ("@Paramater1", adInteger, adParamInput, , 123)
objCmd.Parameters.Append objCmd.CreateParameter ("@Paramater2", adInteger, adParamInput, , 456)

Ответы [ 2 ]

2 голосов
/ 19 сентября 2011

Оказывается, это действительно просто.Все, что вам нужно сделать, это установить соединение для командного объекта после того, как вы установили параметры.Вот так:

Dim objCmd
Set objCmd = server.CreateObject("adodb.command")
objCmd.CommandType = adCmdStoredProc
objCmd.CommandText = "dbname.dbo.sprocName"
objCmd.Parameters.Append objCmd.CreateParameter ("@Paramater1", adInteger, adParamInput, , 123)
objCmd.Parameters.Append objCmd.CreateParameter ("@Paramater2", adInteger, adParamInput, , 456)
objCmd.ActiveConnection = oConn 'set after the command object has been fully configured.
1 голос
/ 19 сентября 2011

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

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

Документация для ADODB.Command , кажется, поддерживает это предложение, я выделил пару важных частей:

Использование метода Refresh в коллекции параметров объекта Command позволяет получить информацию о параметрах поставщика для хранимой процедуры или параметризованного запроса, указанного в объекте Command.Некоторые провайдеры не поддерживают вызовы хранимых процедур или параметризованные запросы;вызов метода Refresh для коллекции Parameters при использовании такого поставщика вернет ошибку.

Если вы не определили свои собственные объекты Parameter и получили доступ к коллекции Parameters до вызова метода Refresh, ADO автоматически вызоветметод и заполнить коллекцию для вас.

Вы можете минимизировать вызовы провайдера для повышения производительности, если вы знаете свойства параметров, связанных с хранимой процедурой или параметризованного запроса, который вы хотите вызвать,Используйте метод CreateParameter для создания объектов Parameter с соответствующими настройками свойств и используйте метод Append, чтобы добавить их в коллекцию Parameters.Это позволяет устанавливать и возвращать значения параметров без необходимости вызова поставщика для получения информации о параметре .Если вы пишете поставщику, который не предоставляет информацию о параметрах, вы должны вручную заполнить коллекцию параметров, используя этот метод, чтобы иметь возможность вообще использовать параметры.При необходимости используйте метод Delete, чтобы удалить объекты Parameter из коллекции Parameters.

Надеюсь, это ответит на ваш вопрос

...