Existem muitos artigos sobre ASP e procedimentos armazenados (Stored Procedures), mas duvido que os autores realmente os tenham praticado. Quando eu era iniciante, consultei muitas informações relevantes e descobri que muitos dos métodos fornecidos não eram os mesmos na prática. Para aplicações simples, esses materiais podem ser úteis, mas estão limitados a isso, porque são basicamente iguais e copiam uns aos outros. Para aplicações um pouco mais complexas, eles não são claros.
Agora, basicamente acesso o SQL Server chamando procedimentos armazenados. O texto a seguir é um resumo da prática, espero que seja útil para todos.
Um procedimento armazenado é um ou mais comandos SQL armazenados no banco de dados como objetos executáveis.
As definições são sempre abstratas. Um procedimento armazenado é na verdade um conjunto de instruções SQL que podem completar determinadas operações, mas esse conjunto de instruções é colocado no banco de dados (aqui falamos apenas sobre SQL Server). Se criarmos procedimentos armazenados e chamarmos procedimentos armazenados em ASP, poderemos evitar misturar instruções SQL com código ASP. Há pelo menos três benefícios em fazer isso:
Primeiro, melhora muito a eficiência. A velocidade de execução do procedimento armazenado em si é muito rápida e a chamada do procedimento armazenado pode reduzir bastante o número de interações com o banco de dados.
Em segundo lugar, melhore a segurança. Se você misturar instruções SQL em código ASP, uma vez que o código seja comprometido, isso também significa que a estrutura da biblioteca será comprometida.
Terceiro, é propício à reutilização de instruções SQL.
No ASP, os procedimentos armazenados geralmente são chamados por meio do objeto de comando. Dependendo da situação, este artigo também apresenta outros métodos de chamada. Para facilitar a explicação, a seguinte classificação simples é feita com base na entrada e na saída do procedimento armazenado:
1. O procedimento armazenado que retorna apenas um único conjunto de registros
assume o seguinte procedimento armazenado (o objetivo deste artigo não é descrever Sintaxe T-SQL, portanto o procedimento armazenado fornece apenas o código, sem explicação):
/*SP1*/
CREATE PROCEDURE dbo.getUserList
as
set nocount on
start
select * from dbo.[userinfo]
end
go
O procedimento armazenado acima obtém todos os registros na tabela userinfo e retorna um conjunto de registros. O código ASP para chamar o procedimento armazenado por meio do objeto de comando é o seguinte:
'**Chamar o procedimento armazenado por meio do objeto de comando**
DIM MyComm,MyRst
Set MyComm = Server.CreateObject("ADODB.Command")
MyComm.ActiveConnection = MyConStr 'MyConStr é a conexão do banco de dados String
MyComm.CommandText = "getUserList" 'Especifique o nome do procedimento armazenado
MyComm.CommandType = 4 'Indica que este é um procedimento armazenado
MyComm.Prepared = true 'Exige que o comando SQL seja compilado primeiro
Definir MyRst = MyComm.Execute
Set MyComm = Nada
de procedimento armazenado O conjunto de registros obtido é atribuído a MyRst. Em seguida, MyRst pode ser operado.
No código acima, o atributo CommandType indica o tipo de solicitação. O valor e a descrição são os seguintes:
-1 indica que o tipo do parâmetro CommandText não pode ser determinado
1 indica que o parâmetro CommandText é um tipo de comando geral2 indica que o
parâmetro CommandText é um tipo de comando geral
.O parâmetro CommandText é um nome de tabela existente
4 indica que o parâmetro CommandText é O nome de um procedimento armazenado
também pode chamar o procedimento armazenado por meio do objeto Connection ou do objeto Recordset Os métodos são os seguintes:
'**Chamar o procedimento armazenado por meio do objeto Connection. object**
DIM MyConn,MyRst
Set MyConn = Server.CreateObject("ADODB.Connection")
MyConn .open MyConStr 'MyConStr é a string de conexão do banco de dados
Set MyRst = MyConn.Execute("getUserList",0,4) 'O último parâmetro tem o mesmo significado que CommandType
Set MyConn = Nothing
'**Chamando o procedimento armazenado por meio do objeto Recordset**
DIM MyRst
Set MyRst = Server.CreateObject("ADODB.Recordset")
MyRst.open "getUserList",MyConStr,0,1 ,4
'MyConStr é a string de conexão do banco de dados, o último parâmetro tem o mesmo significado que CommandType
2. Não há armazenamento de entrada e saída. Consulte o seguinte procedimento armazenado para o processo
:
/*SP2*/
CREATE PROCEDURE dbo.delUserAll
conforme
definido nocount on
start
delete from dbo.[userinfo]
end
go
Este procedimento armazenado exclui todos os registros na tabela userinfo sem qualquer entrada ou saída Chamada O método é basicamente o mesmo mencionado acima, exceto que não há necessidade de obter o conjunto de registros. :
'**Chamar o procedimento armazenado através do objeto Command**
DIM MyComm
Set MyComm = Server.CreateObject("ADODB.Command")
MyComm.ActiveConnection = MyConStr 'MyConStr é a string de conexão do banco de dados
MyComm.CommandText = "delUserAll" 'Especificar o nome do procedimento armazenado
MyComm.CommandType = 4 'Indica que este é um procedimento armazenado
MyComm.Prepared = true 'Exige que o comando SQL seja compilado primeiro
MyComm.Execute 'Não há necessidade de obter o registro definido aqui
Set MyComm = Nothing
Claro, esses procedimentos armazenados também podem ser chamados por meio do objeto Connection ou do objeto Recordset, mas o objeto Recordset é criado para obter o conjunto de registros. Se o conjunto de registros não for retornado, é melhor usar o objeto Command.
3.Ao realizar operações semelhantes ao SP2,
os procedimentos armazenados com valores de retorno
devem fazer uso total dos poderosos recursos de processamento de transações do SQL Server para manter a consistência dos dados.Além disso, podemos precisar do procedimento armazenado para retornar o status de execução. Para esse fim, modifique o SP2 da seguinte maneira:
/*SP3*/
CREATE PROCEDURE dbo.delUserAll
as
set nocount on
start
BEGIN TRANSACTION
delete from dbo.[userinfo]
IF error= 0
start
COMMIT TRANSACTION
return 1
end
ELSE
start
ROLLBACK TRANSACTION
return 0
end
return
end
go
O procedimento armazenado acima retorna 1 quando a exclusão é executada com sucesso, caso contrário, ele retorna 0 e executa a operação de rollback. Para obter o valor de retorno em ASP, você precisa usar a coleção Parameters para declarar os parâmetros:
'**Chame o procedimento armazenado com o valor de retorno e obtenha o valor de retorno**
DIM MyComm,MyPara
Set MyComm = Server.CreateObject ("ADODB.Command")
MyComm.ActiveConnection = MyConStr 'MyConStr é a string de conexão do banco de dados
MyComm.CommandText = "delUserAll" 'Especifique o nome do procedimento armazenado
MyComm.CommandType = 4 'Indica que este é um procedimento armazenado
MyComm.Prepared = true 'Requer que os comandos SQL sejam compilados primeiro
' instrução Valor de retorno
Set Mypara = MyComm.CreateParameter("RETURN",2,4)
MyComm.Parameters.Append MyPara
MyComm.Execute
'Obtém o valor de retorno
DIM retValue
retValue = MyComm(0) ' ou retValue = MyComm.Parameters(0)
Definir MyComm = Nothing
Em MyComm.CreateParameter("RETURN",2,4), o significado de cada parâmetro é o seguinte:
O primeiro parâmetro ("RETURE") é o nome do parâmetro. O nome do parâmetro pode ser definido arbitrariamente, mas geralmente deve ser igual ao nome do parâmetro declarado no procedimento armazenado. Aqui está o valor de retorno, que normalmente defino como "RETURE";
o segundo parâmetro (2) indica o tipo de dados do parâmetro. Para códigos de tipo específicos, consulte a referência do ADO.
adBigInt: 20;
adBinário
: 128;
adBoolean: 11;
adSmallInt
: 2
; adTinyInt: 16
;
Parao
valor de retorno, apenas valores
inteiros
pode ser obtido, e -1 a -99 é um valor reservado;
o terceiro parâmetro (4) indica a natureza do parâmetro, onde 4 indica que este é um valor de retorno; A descrição do valor deste parâmetro é a seguinte:
0: O tipo não pode ser determinado; 1: Parâmetro de entrada 2: Parâmetro de entrada 3: Parâmetro de entrada ou saída 4: Valor de retorno
O código ASP fornecido acima
;seja um código completo, também Esse é o código mais complexo. Na verdade,
Set Mypara = MyComm.CreateParameter("RETURN",2,4)
MyComm.Parameters.Append MyPara
pode ser simplificado para
MyComm.Parameters.Append MyComm.CreateParameter( "RETURN",2,4)
ou ainda Você pode continuar simplificando, o que será explicado mais tarde.
Para procedimentos armazenados com parâmetros, eles só podem ser chamados usando o objeto Command (também há informações de que eles podem ser chamados através do objeto Connection ou do objeto Recordset, mas ainda não tentei).
4. O valor de retorno de um procedimento armazenado com parâmetros de entrada e parâmetros de saída
é, na verdade, um parâmetro de saída especial. Na maioria dos casos, usamos procedimentos armazenados que possuem parâmetros de entrada e saída. Por exemplo, queremos obter o nome de usuário de um usuário com um determinado ID na tabela de informações do usuário. --user ID e um parâmetro de saída ----nome do usuário. O procedimento armazenado para implementar esta função é o seguinte:
/*SP4*/
CREATE PROCEDURE dbo.getUserName
@UserID int,
@UserName varchar(40) saída
como
set nocount no
início
se @UserID for nulo return
select @UserName=username
from dbo .[ userinfo]
onde userid=@UserID
return
end
go
O código ASP para chamar o procedimento armazenado é o seguinte:
'**Chame o procedimento armazenado com parâmetros de entrada e saída**
DIM MyComm,UserID,UserName
UserID = 1
Set MyComm = Server.CreateObject(" ADODB.Command")
MyComm.ActiveConnection = MyConStr 'MyConStr é a string de conexão do banco de dados
MyComm.CommandText = "getUserName" 'Especifique o nome do procedimento armazenado
MyComm.CommandType = 4 'Indica que este é um procedimento armazenado
MyComm. Prepared = true 'Requer SQL Compile o comando primeiro
e declare os parâmetros
MyComm.Parameters.append MyComm.CreateParameter("@UserID",3,1,4,UserID)
MyComm.Parameters.append MyComm.CreateParameter("@UserName", 200,2,40)
MyComm. Execute
'Obtém os parâmetros
UserName = MyComm(1)
Set MyComm = Nothing
No código acima, você pode ver que, ao contrário da declaração do valor de retorno, 5 parâmetros são necessários ao declarar parâmetros de entrada e 4 parâmetros são necessários ao declarar parâmetros de saída. Ao declarar parâmetros de entrada, os cinco parâmetros são: nome do parâmetro, tipo de dados do parâmetro, tipo de parâmetro, comprimento dos dados e valor do parâmetro. Ao declarar um parâmetro de saída, não existe um último parâmetro: o valor do parâmetro.
Atenção especial deve ser dada: ao declarar parâmetros, a ordem deve ser a mesma definida no procedimento armazenado, e o tipo de dados e comprimento de cada parâmetro também devem ser iguais aos definidos no procedimento armazenado.
Se o procedimento armazenado tiver vários parâmetros, o código ASP parecerá complicado. Você pode usar o comando with para simplificar o código:
'**Chamar um procedimento armazenado com parâmetros de entrada e saída (código simplificado)**
DIM MyComm,UserID,UserName.
UserID = 1
Definir MyComm = Server.CreateObject("ADODB.Command")
com MyComm
.ActiveConnection = MyConStr 'MyConStr é a string de conexão do banco de dados.CommandText
= "getUserName" 'Especifique o nome do procedimento armazenado.CommandType
= 4 'Indica que este é um procedimento armazenado.Prepared
= true 'Exige que o comando SQL seja compilado primeiro.Parameters.append
.CreateParameter("@UserID",3,1,4,UserID)
.Parameters.append .CreateParameter("@UserName",200, 2,40)
.Execute
end with
UserName = MyComm(1)
Set MyComm = Nothing
Se quisermos obter os nomes de usuário de 10 usuários com IDs de 1 a 10, precisamos criar o objeto Command 10 vezes? Não. Se você precisar chamar o mesmo procedimento armazenado várias vezes, basta alterar os parâmetros de entrada e você obterá saídas diferentes:
'**Várias chamadas para o mesmo procedimento armazenado**
DIM MyComm,UserID,UserName
UserName = ""
Set MyComm = Server .CreateObject( "ADODB.Command")
para UserID = 1 a 10
com MyComm
.ActiveConnection = MyConStr 'MyConStr é a string de conexão do banco de dados.CommandText
= "getUserName" 'Especifique o nome do procedimento armazenado.CommandType
= 4 'Indica que este é um procedimento armazenado.Prepared
= true 'Requer que comandos SQL sejam compilados primeiro
se UserID = 1 então
.Parameters.append .CreateParameter("@UserID",3,1,4,UserID)
.Parameters.append .CreateParameter("@UserName" ,200,2,40 )
.Execute
else
'Reatribuir os parâmetros de entrada (parâmetros de entrada e parâmetros de saída cujos valores de parâmetros não mudam neste momento não precisam ser declarados novamente)
.Parameters("@UserID") = UserID
.Execute
end if
end with
UserName = UserName + MyComm( 1) + "," 'Talvez você queira usar um array para armazenar
o próximo
Set MyComm = Nothing
Comovocê pode ver no código acima: ao chamar o mesmo procedimento armazenado. repetidamente, você só precisa reatribuir os parâmetros de entrada cujos valores foram alterados. Este método é Quando há vários parâmetros de entrada e saída e o valor de apenas um parâmetro de entrada muda cada vez que é chamado, a quantidade de código pode ser. bastante reduzido.
5. Procedimentos armazenados que possuem valores de retorno, parâmetros de entrada e parâmetros de saída ao mesmo tempo Conforme
mencionado anteriormente, ao chamar um procedimento armazenado, a ordem na qual os parâmetros são declarados deve ser a mesma ordem definida no procedimento armazenado. . Outro ponto ao qual devemos prestar atenção especial: se o procedimento armazenado tiver um valor de retorno e parâmetros de entrada e saída, o valor de retorno deverá ser declarado primeiro.
Para demonstrar o método de chamada neste caso, vamos melhorar o exemplo acima. Ainda obtenha o nome de usuário do usuário com ID 1, mas é possível que o usuário não exista (o usuário foi excluído e o ID do usuário é um campo de aumento automático). O procedimento armazenado retorna valores diferentes dependendo se o usuário existe ou não. Neste momento, o procedimento armazenado e o código ASP são os seguintes:
/*SP5*/
CREATE PROCEDURE dbo.getUserName
--Para aprofundar a impressão de "sequência", inverta a ordem de definição dos dois parâmetros a seguir
@UserName varchar( 40) saída,
@UserID int
como
definido nocount no
início
se @UserID for nulo return
select @UserName=nome de usuário
de dbo.[userinfo]
onde userid=@UserID
if rowcount> 0
return 1
else
return 0
return
end
go
'**The chamada tem valor de retorno e procedimentos armazenados de entrada para parâmetros e parâmetros de saída**
DIM MyComm,UserID,UserName
UserID = 1
Set MyComm = Server.CreateObject("ADODB.Command")
with MyComm
.ActiveConnection = MyConStr 'MyConStr é a conexão do banco de dados string.CommandText
= "getUserName" 'Especifique o nome do procedimento armazenado.CommandType
= 4 'Indica que este é um procedimento armazenado
Preparado = true 'Requer que o comando SQL seja compilado primeiro
' O valor de retorno deve ser declarado primeiro.Parameters.Append
.CreateParameter("RETURN",2,4)
'A ordem de declaração dos dois parâmetros a seguir também é invertida de acordo.Parameters.append
.CreateParameter("@UserName",200,2,40)
.Parameters.append .CreateParameter(" @UserID",3,1,4,UserID)
. Execute
final com
if MyComm(0) = 1 then
UserName = MyComm(1)
else
UserName = "Este usuário não existe"
finalize if
Set MyComm = Nothing
6. Procedimentos armazenados que retornam parâmetros e conjuntos de registros ao mesmo tempo
Às vezes, precisamos de procedimentos armazenados Retornar parâmetros e conjuntos de registros ao mesmo tempo. Por exemplo, ao usar procedimentos armazenados para paginação, parâmetros como conjuntos de registros e volume total de dados devem ser retornados ao mesmo tempo. tempo. A seguir está um procedimento armazenado para processamento de paginação:
/*SP6*/
CREATE PROCEDURE dbo.getUserList
@iPageCount int OUTPUT, --Número total de páginas
@iPage int, --Número da página atual
@iPageSize int --Número de registros por página
como
set nocount no
início
--Crie uma tabela temporária,
crie a tabela #t (ID int IDENTITY, --Incremento automático do campo
userid int,
nome de usuário varchar(40))
--Grave os dados na
inserção da tabela temporária em #t
selecione o ID do usuário, nome de usuário de dbo.[UserInfo]
ordenar por ID do usuário
--Obter o número total de registros
declarar @iRecordCount int
set @iRecordCount = rowcount
--Determinar o número total de páginas
IF @iRecordCount%@iPageSize=0
SET @iPageCount=CEILING(@ iRecordCount/@iPageSize)
ELSE
SET @iPageCount=CEILING(@iRecordCount/@iPageSize)+1
--Se o número da página solicitada for maior que o número total de páginas, exiba a última página
IF @iPage > @iPageCount
SELECT @iPage = @iPageCount
--Determina os registros de início e fim da página atual
DECLARE @iStart int --start record
DECLARE @iEnd int --end record
SELECT @iStart = (@iPage - 1) * @iPageSize
SELECT @iEnd = @iStart + @iPageSize + 1
--Obtém o registro da página atual
selecione * de # t onde ID> @iStart e ID <@iEnd
--Exclui a tabela temporária
DROP TABLE #t
--Retorna o número total de registros
return @iRecordCount
end
goIn
the procedimento armazenado acima, insira o número da página atual e o número de registros por página e retorne a página atual O conjunto de registros, o número total de páginas e o número total de registros. Para ser mais típico, o número total de registros é retornado como um valor de retorno. A seguir está o código ASP que chama o procedimento armazenado (a operação de paginação específica é omitida):
'**Chamar o procedimento armazenado de paginação**
DIM pagenow,pagesize,pagecount,recordcount
DIM MyComm,MyRst
pagenow = Request("pn")
'Custom A função é usada para verificar números naturais
se CheckNar(pagenow) = false then pagenow = 1
pagesize = 20
Set MyComm = Server.CreateObject("ADODB.Command")
with MyComm
.ActiveConnection = MyConStr 'MyConStr é a string de conexão do banco de dados .CommandText
= "getUserList " 'Especifique o nome do procedimento armazenado.CommandType
= 4 'Indica que este é um procedimento armazenado
. Prepared = true 'Requer que os comandos SQL sejam compilados primeiro
' Valor de retorno (número total de registros)
.Parameters.Append . CreateParameter("RETURN",2,4 )
'Parâmetros de saída (número total de páginas)
.Parameters.Append .CreateParameter("@iPageCount",3,2)
'Parâmetros de entrada (número da página atual)
.Parameters.append .CreateParameter( "@iPage",3,1,4 ,pagenow)
'Parâmetros de entrada (número de registros por página)
.Parameters.append .CreateParameter("@iPageSize",3,1,4,pagesize)
Set MyRst = .Execute
end with
if MyRst.state = 0 then 'Dados não obtidos, MyRst close
recordcount = -1
else
MyRst.close 'Nota: Para obter o valor do parâmetro, você precisa fechar o objeto do conjunto de registros primeiro
recordcount = MyComm(0)
pagecount = MyComm( 1)
if cint(pagenow)> =cint(pagecount) then pagenow=pagecount
end if
Set MyComm = Nothing
'O seguinte exibe o registro
se recordcount = 0 então
Response.Write "No record"
elseif recordcount > 0 then
MyRst.open
do até MyRst.EOF
......
loop
'O seguinte exibe as informações de paginação
...
else 'recordcount=-1
Response.Write "Erro de parâmetro"
end if
Em relação ao código acima, há apenas um ponto que precisa ser explicado: ao retornar o conjunto de registros e os parâmetros ao mesmo tempo, se desejar obter os parâmetros, você precisa primeiro fechar o conjunto de registros e, em seguida, abrir o conjunto de registros ao usá-lo.
7. Procedimentos armazenados que retornam vários conjuntos de registros
A primeira coisa que este artigo apresenta são os procedimentos armazenados que retornam conjuntos de registros. Às vezes, um procedimento armazenado é necessário para retornar vários conjuntos de registros. No ASP, como obter esses conjuntos de registros ao mesmo tempo? Para ilustrar este problema, adicione dois campos à tabela userinfo: usertel e usermail, e defina que apenas usuários logados possam visualizar esses dois conteúdos.
/*SP7*/
CREATE PROCEDURE dbo.getUserInfo
@userid int,
@checklogin bit
como
set nocount no
início
se @userid for nulo ou @checklogin for nulo retorne
selecione o nome de usuário
de dbo.[usrinfo]
onde userid=@userid
--if Log no usuário, obtenha usertel e usermail
se @checklogin=1
select usertel,usermail
from dbo.[userinfo]
where userid=@userid
return
end
goO
seguinte é o código ASP:
'**Chame um procedimento armazenado que retorna vários conjuntos de registros**
DIM checklg,UserID,UserName,UserTel,UserMail
DIM MyComm,MyRst
UserID = 1
'checklogin() é uma função personalizada para determinar se o visitante está logado
checklg = checklogin()
Set MyComm = Server.CreateObject("ADODB.Command" )
com MyComm
.ActiveConnection = MyConStr 'MyConStr é a string de conexão do banco de dados.CommandText
= "getUserInfo" 'Especifique o nome do procedimento armazenado.CommandType
= 4 'Indica que este é um procedimento armazenado.Prepared
= true 'Requer que o comando SQL seja compilado first.Parameters.append
.CreateParameter ("@userid",3,1,4,UserID)
.Parameters.append .CreateParameter("@checklogin",11,1,1,checklg)
Definir MyRst = .Execute
final com
Set MyComm = Nothing
'Do primeiro obtém o valor do conjunto de registros
UserName = MyRst(0)
'Obtém o valor do segundo conjunto de registros
se não MyRst for Nothing então
Set MyRst = MyRst.NextRecordset()
UserTel = MyRst(0)
UserMail = MyRst(1)
end if
Set MyRst = Nothing
No código acima, o método NextRecordset do objeto Recordset é usado para obter vários conjuntos de registros retornados pelo procedimento armazenado.
Até agora, este artigo forneceu uma explicação relativamente abrangente de diversas situações nas quais o ASP chama procedimentos armazenados. Finalmente, vamos falar sobre os diferentes métodos de chamada de vários procedimentos armazenados em um programa ASP.
Em um programa ASP, é possível chamar vários procedimentos armazenados pelo menos das três maneiras a seguir:
1. Criar vários objetos Command
DIM MyComm
Set MyComm = Server.CreateObject("ADODB.Command")
'Chamar o procedimento armazenado um
.. . ...
Set MyComm = Nothing
Set MyComm = Server.CreateObject("ADODB.Command")
'Chama o procedimento armazenado dois
...
Set MyComm = Nothing
...
2. Crie apenas um objeto Command, ao finalizar uma chamada, limpe seu parâmetros
DIM MyComm
Set MyComm = Server.CreateObject("ADODB.Command")
'Chamar o procedimento armazenado um
...
'Limpar parâmetros (assumindo que há três parâmetros)
MyComm.Parameters.delete 2
MyComm.delete 1
MyComm.Parameters. delete 0
'Chama o procedimento armazenado dois e limpa os parâmetros
...
Set MyComm = Nothing
Neste momento, observe: a ordem de limpeza dos parâmetros é oposta à ordem de declaração dos parâmetros. O motivo é que não sei. .
3. Use o método Refresh da coleção de dados Parâmetros para redefinir o objeto Parâmetro
DIM MyComm
Set MyComm = Server.CreateObject("ADODB.Command")
'Chamar o procedimento armazenado um
...
'Redefinir todos os objetos Parâmetro contidos na coleção de dados Parâmetros
MyComm.Parameters.Refresh
'Chamar procedimento armazenado 2
...
Set MyComm = Nothing
Geralmente acredita-se que criar objetos repetidamente é um método menos eficiente, mas após o teste (a ferramenta de teste é o Microsoft Application Center Test), os resultados são inesperados:
Método 2 > = Método 1 >> Método 3
A velocidade de execução do Método 2 é maior ou igual ao Método 1 (até cerca de 4% maior). A velocidade de execução desses dois métodos é muito mais rápida que a do Método 3 (até 130). %), por isso é recomendado. Quando há muitos parâmetros, usa-se o método 1; quando há poucos parâmetros, usa-se o método 2.
Levei um dia para finalmente escrever um pouco da minha experiência superficial em chamar procedimentos armazenados em ASP. Entre eles, alguns deles eu só conheço os efeitos, mas não as causas, e alguns podem estar errados, mas tudo isso ocorre através da minha prática pessoal. Por favor, aceitem-no criticamente, leitores. Se você tiver alguma opinião diferente, por favor me avise. Agradecemos antecipadamente.