Un proceso almacenado es uno o más comandos SQL almacenados en la base de datos como objetos ejecutables.
Las definiciones son siempre abstractas. Un proceso almacenado es en realidad un conjunto de declaraciones SQL que pueden completar ciertas operaciones, pero este conjunto de declaraciones se coloca en la base de datos (aquí solo hablamos de SQL SERVER). Si creamos un proceso almacenado y llamamos al proceso almacenado en ASP, podemos evitar mezclar declaraciones SQL con código ASP. Hay al menos tres beneficios al hacer esto:
En primer lugar, mejorar enormemente la eficiencia. La velocidad de ejecución del proceso almacenado en sí es muy rápida y llamar al proceso almacenado puede reducir en gran medida la cantidad de interacciones con la base de datos.
En segundo lugar, mejorar la seguridad. Si mezcla sentencias SQL en código ASP, una vez que el código se ve comprometido, también significa que la estructura de la biblioteca está comprometida.
En tercer lugar, favorece la reutilización de declaraciones SQL.
En ASP, los procesos almacenados generalmente se llaman a través del objeto COMMAND. Dependiendo de la situación, este artículo también presenta otros métodos de llamada. Para facilitar la explicación, se realizan las siguientes clasificaciones simples basadas en la entrada y salida del proceso almacenado:
1. Un proceso almacenado que solo devuelve un único conjunto de registros.
Supongamos que existe el siguiente proceso almacenado (el propósito de este artículo no es describir la sintaxis de T-SQL, por lo que el proceso almacenado solo proporciona el código sin explicación):
/*SP1*/
CREAR PROCEDIMIENTO DBO.GETUSERLIST
COMO
ESTABLECER SIN CUENTA EN
COMENZAR
SELECCIONAR * DE DBO.[INFORMACIÓN DE USUARIO]
FIN
IR
El proceso almacenado anterior obtiene todos los registros de la tabla USERINFO y devuelve un conjunto de registros. El código ASP para llamar al proceso almacenado a través del objeto COMMAND es el siguiente:
'**Llamar al proceso almacenado a través del objeto COMMAND**
DIM MYCOMM,MYRST
ESTABLECER MICOMM = SERVIDOR.CREATEOBJECT(ADODB.COMMAND)
MYCOMM.ACTIVECONNECTION = MYCONSTR 'MYCONSTR es la cadena de conexión de la base de datos
MYCOMM.COMMANDTEXT = GETUSERLIST 'Especifique el nombre del proceso almacenado
MYCOMM.COMMANDTYPE = 4 'Indica que este es un proceso almacenado
MYCOMM.PREPARED = TRUE 'Requiere que los comandos SQL se compilen primero
ESTABLECER MYRST = MICOMUNICACIÓN.EJECUTAR
ESTABLECER MYCOMM = NADA
El conjunto de registros obtenido mediante el proceso de almacenamiento se asigna a MYRST. A continuación, se puede operar MYRST.
En el código anterior, el atributo COMMANDTYPE indica el tipo de solicitud. El valor y la descripción son los siguientes:
-1 indica que no se puede determinar el tipo del parámetro COMMANDTEXT
1 indica que COMMANDTEXT es un tipo de comando general
2 indica que el parámetro COMMANDTEXT es un nombre de tabla con
4 indica que el parámetro COMMANDTEXT es el nombre de un proceso almacenado
También puede llamar al proceso almacenado a través del objeto CONNECTION o el objeto RECORDSET. Los métodos son los siguientes:
'**Llamando al proceso almacenado a través del objeto CONNECTION**
DIMMYCONN,MYRST
ESTABLECER MYCONN = SERVIDOR.CREATEOBJECT(ADODB.CONEXIÓN)
MYCONN.OPEN MYCONSTR 'MYCONSTR es la cadena de conexión de la base de datos
SET MYRST = MYCONN.EXECUTE(GETUSERLIST,0,4) 'El último parámetro tiene el mismo significado que COMMANDTYPE
ESTABLECER MYCONN = NADA
'**Llamando al proceso almacenado a través del objeto RECORDSET**
DIMMIRST
ESTABLECER MYRST = SERVIDOR.CREATEOBJECT(ADODB.RECORDSET)
MYRST.OPEN GETUSERLIST,MYCONSTR,0,1,4
'MYCONSTR es la cadena de conexión de la base de datos, el último parámetro tiene el mismo significado que COMMANDTYPE
2. Proceso almacenado sin entrada ni salida.
Eche un vistazo a los siguientes procedimientos almacenados:
/*SP2*/
CREAR PROCEDIMIENTO DBO.DELUSERALL
COMO
ESTABLECER SIN CUENTA EN
COMENZAR
ELIMINAR DE DBO.[INFO USUARIO]
FIN
IR
Este proceso almacenado elimina todos los registros en la tabla USERINFO sin ninguna entrada o salida. El método de llamada es básicamente el mismo que el mencionado anteriormente, excepto que no es necesario obtener el conjunto de registros:
'**Llamar al proceso almacenado a través del objeto COMMAND**
DIMMYCOMM
ESTABLECER MICOMM = SERVIDOR.CREATEOBJECT(ADODB.COMMAND)
MYCOMM.ACTIVECONNECTION = MYCONSTR 'MYCONSTR es la cadena de conexión de la base de datos
MYCOMM.COMMANDTEXT = DELUSERALL 'Especifique el nombre del proceso almacenado
MYCOMM.COMMANDTYPE = 4 'Indica que este es un proceso almacenado
MYCOMM.PREPARED = TRUE 'Requiere que los comandos SQL se compilen primero
MYCOMM.EXECUTE 'No es necesario obtener el registro establecido aquí
ESTABLECER MYCOMM = NADA
Por supuesto, este tipo de proceso almacenado también se puede llamar a través del objeto CONNECTION o del objeto RECORDSET. Sin embargo, el objeto RECORDSET se crea para obtener el conjunto de registros. Si el conjunto de registros no se devuelve, utilice el objeto COMMAND.
3. Procedimientos almacenados con valores de retorno.
Al realizar operaciones similares a SP2, debe aprovechar al máximo las potentes capacidades de procesamiento de transacciones de SQL SERVER para mantener la coherencia de los datos. Además, es posible que necesitemos almacenar el estado de ejecución devuelto por el proceso. Para ello, modifique el SP2 de la siguiente manera:
/*SP3*/
CREAR PROCEDIMIENTO DBO.DELUSERALL
COMO
ESTABLECER SIN CUENTA EN
COMENZAR
COMENZAR LA TRANSACCIÓN
ELIMINAR DE DBO.[INFO USUARIO]
SI @@ERROR=0
COMENZAR
COMPROMETER TRANSACCIÓN
VOLVER 1
FIN
DEMÁS
COMENZAR
TRANSACCIÓN DE ROLLBACK
VOLVER 0
FIN
DEVOLVER
FIN
IR
El proceso almacenado anterior devuelve 1 cuando DELETE se ejecuta correctamente; de lo contrario, devuelve 0 y realiza la operación de reversión. Para obtener el valor de retorno en ASP, debe utilizar la colección PARAMETERS para declarar parámetros:
'**Llame a un proceso almacenado con un valor de retorno y obtenga el valor de retorno**
DIM MYCOMM,MYPARA
ESTABLECER MICOMM = SERVIDOR.CREATEOBJECT(ADODB.COMMAND)
MYCOMM.ACTIVECONNECTION = MYCONSTR 'MYCONSTR es la cadena de conexión de la base de datos
MYCOMM.COMMANDTEXT = DELUSERALL 'Especifique el nombre del proceso almacenado
MYCOMM.COMMANDTYPE = 4 'Indica que este es un proceso almacenado
MYCOMM.PREPARED = TRUE 'Requiere que los comandos SQL se compilen primero
'Declarar valor de retorno
SET MYPARA = MYCOMM.CREATEPARAMETER(RETORNO,2,4)
MYCOMM.PARAMETERS.APPEND MYPARA
MYCOMM.EJECUTAR
'Obtener el valor de retorno
REVALOR DIM
VALORRETV = MYCOMM(0) 'o VALORRETV = MYCOMM.PARAMETERS(0)
ESTABLECER MYCOMM = NADA
En MYCOMM.CREATEPARAMETER(RETURN,2,4), el significado de cada parámetro es el siguiente:
El primer parámetro (RETURE) es el nombre del parámetro. El nombre del parámetro se puede establecer arbitrariamente, pero generalmente debe ser el mismo que el nombre del parámetro declarado en el proceso almacenado. Aquí está el valor de retorno, normalmente lo configuro en RETURE;
El segundo parámetro (2) indica el tipo de datos del parámetro. Consulte la referencia de ADO para conocer los códigos de tipo específicos que se detallan a continuación:
ADBIGINTA: 20;
ADBINARIO: 128;
ADBOOLEANO: 11;
ADCHAR: 129;
ADDBTIMESTAMP: 135;
ADEMPTY: 0;
ADINTERO: 3;
ADSMALLINT: 2;
ADTINYINT: 16;
ADVARCHAR: 200;
Para el valor de retorno, solo se pueden tomar valores enteros y -1 a -99 son valores reservados;
El tercer parámetro (4) indica la naturaleza del parámetro, donde 4 indica que se trata de un valor de retorno. La descripción del valor de este parámetro es la siguiente:
0: No se puede determinar el tipo; 1: Parámetro de entrada; 2: Parámetro de entrada; 3: Parámetro de entrada o salida;
Se debe decir que el código ASP proporcionado anteriormente es el código completo, es decir, el código más complejo.
SET MYPARA = MYCOMM.CREATEPARAMETER(RETORNO,2,4)
MYCOMM.PARAMETERS.APPEND MYPARA
se puede simplificar a
PARÁMETROS.MYCOMM.APEND MYCOMM.CREATEPARAMETER(RETORNO,2,4)
Incluso se puede simplificar aún más, como se explicará más adelante.
Para los procedimientos almacenados con parámetros, solo se pueden llamar usando el objeto COMMAND (también hay información de que se pueden llamar a través del objeto CONNECTION o RECORDSET, pero no lo he probado).
4. Proceso almacenado con parámetros de entrada y parámetros de salida.
El valor de retorno es en realidad un parámetro de salida especial. En la mayoría de los casos, utilizamos un proceso almacenado que tiene parámetros de entrada y salida. Por ejemplo, queremos obtener el nombre de usuario de un usuario con una determinada ID en la tabla de información del usuario. ---ID de usuario y un parámetro de salida----nombre de usuario. El proceso almacenado que implementa esta función es el siguiente:
/*SP4*/
CREAR PROCEDIMIENTO DBO.GETUSERNAME
@USERIDINT,
@NOMBRE DE USUARIO VARCHAR(40) SALIDA
COMO
ESTABLECER SIN CUENTA EN
COMENZAR
SI @USERID ES DEVOLUCIÓN NULA
SELECCIONAR @NOMBRE DE USUARIO = NOMBRE DE USUARIO
DE DBO.[INFO USUARIO]
DONDE IDUSUARIO=@IDUSUARIO
DEVOLVER
FIN
IR
El código ASP que llama al proceso almacenado es el siguiente:
'**Llamar a un proceso almacenado con parámetros de entrada y salida**
DIM MYCOMM, ID DE USUARIO, NOMBRE DE USUARIO
ID DE USUARIO = 1
ESTABLECER MICOMM = SERVIDOR.CREATEOBJECT(ADODB.COMMAND)
MYCOMM.ACTIVECONNECTION = MYCONSTR 'MYCONSTR es la cadena de conexión de la base de datos
MYCOMM.COMMANDTEXT = GETUSERNAME 'Especifique el nombre del proceso almacenado
MYCOMM.COMMANDTYPE = 4 'Indica que este es un proceso almacenado
MYCOMM.PREPARED = TRUE 'Requiere que los comandos SQL se compilen primero
'Declarar parámetros
MYCOMM.PARAMETERS.APPEND MYCOMM.CREATEPARAMETER(@USERID,3,1,4,USERID)
MYCOMM.PARAMETERS.APPEND MYCOMM.CREATEPARAMETER(@NOMBRE DE USUARIO,200,2,40)
MYCOMM.EJECUTAR
'Obtener los parámetros
NOMBRE DE USUARIO = MICOM(1)
ESTABLECER MYCOMM = NADA
En el código anterior, puede ver que, a diferencia de declarar un valor de retorno, se requieren 5 parámetros al declarar parámetros de entrada y 4 parámetros al declarar parámetros de salida. Al declarar parámetros de entrada, los cinco parámetros son: nombre del parámetro, tipo de datos del parámetro, tipo de parámetro, longitud de los datos y valor del parámetro. Al declarar un parámetro de salida, no hay un último parámetro: el valor del parámetro.
Se debe prestar especial atención a: al declarar parámetros, el orden debe ser el mismo que el definido en el proceso de almacenamiento, y el tipo de datos y la longitud de cada parámetro también deben ser los mismos que los definidos en el proceso de almacenamiento.
Si el proceso almacenado tiene múltiples parámetros, el código ASP parecerá engorroso. Puede usar el comando CON para simplificar el código:
'**Llamar a un proceso almacenado con parámetros de entrada y salida (código simplificado)**
DIM MYCOMM, ID DE USUARIO, NOMBRE DE USUARIO
ID DE USUARIO = 1
ESTABLECER MICOMM = SERVIDOR.CREATEOBJECT(ADODB.COMMAND)
CON MYCOMM
.ACTIVECONNECTION = MYCONSTR 'MYCONSTR es la cadena de conexión de la base de datos
.COMMANDTEXT = GETUSERNAME 'Especifique el nombre del proceso almacenado
.COMMANDTYPE = 4 'Indica que este es un proceso almacenado
.PREPARED = TRUE 'Requiere que los comandos SQL se compilen primero
.PARAMETERS.APPEND .CREATEPARAMETER(@USERID,3,1,4,USERID)
.PARAMETERS.APPEND .CREATEPARAMETER(@NOMBRE DE USUARIO,200,2,40)
.EJECUTAR
TERMINAR CON
NOMBRE DE USUARIO = MICOM(1)
ESTABLECER MYCOMM = NADA
Si queremos obtener los nombres de usuario de 10 usuarios con ID del 1 al 10, ¿necesitamos crear objetos COMMAND 10 veces? No. Si necesita llamar al mismo proceso almacenado varias veces, simplemente cambie los parámetros de entrada y obtendrá un resultado diferente:
'**Múltiples llamadas al mismo proceso almacenado**
DIM MYCOMM, ID DE USUARIO, NOMBRE DE USUARIO
NOMBRE DE USUARIO=
ESTABLECER MICOMM = SERVIDOR.CREATEOBJECT(ADODB.COMMAND)
PARA ID DE USUARIO = 1 A 10
CON MYCOMM
.ACTIVECONNECTION = MYCONSTR 'MYCONSTR es la cadena de conexión de la base de datos
.COMMANDTEXT = GETUSERNAME 'Especifique el nombre del proceso almacenado
.COMMANDTYPE = 4 'Indica que este es un proceso almacenado
.PREPARED = TRUE 'Requiere que los comandos SQL se compilen primero
SI ID DE USUARIO = 1 ENTONCES
.PARAMETERS.APPEND .CREATEPARAMETER(@USERID,3,1,4,USERID)
.PARAMETERS.APPEND .CREATEPARAMETER(@NOMBRE DE USUARIO,200,2,40)
.EJECUTAR
DEMÁS
'Reasigne valores a los parámetros de entrada (los parámetros de entrada y los parámetros de salida cuyos valores de parámetros no cambian en este momento no necesitan volver a declararse)
.PARAMETROS(@USERID) = USERID
.EJECUTAR
FINALIZAR SI
TERMINAR CON
NOMBRE DE USUARIO = NOMBRE DE USUARIO + MYCOMM(1) + , 'Tal vez le guste usar almacenamiento en matriz
PRÓXIMO
ESTABLECER MYCOMM = NADA
Como se puede ver en el código anterior: al llamar repetidamente al mismo proceso almacenado, solo necesita reasignar los parámetros de entrada cuyos valores han cambiado. Este método tiene múltiples parámetros de entrada y salida, y solo se llama a un valor de parámetro de entrada cada uno. tiempo Cuando se producen cambios, la cantidad de código se puede reducir significativamente.
5. Un proceso almacenado con valores de retorno, parámetros de entrada y parámetros de salida al mismo tiempo.
Como se mencionó anteriormente, al llamar a un proceso almacenado, el orden en que se declaran los parámetros debe ser el mismo que el orden definido en el proceso almacenado. Otro punto al que prestar especial atención: si el proceso almacenado tiene tanto un valor de retorno como parámetros de entrada y salida, el valor de retorno debe declararse primero.
Para demostrar el método de llamada en este caso, mejoremos el ejemplo anterior. Todavía obtengo el nombre de usuario del usuario con ID 1, pero es posible que el usuario no lo tenga (el usuario ha sido eliminado y USERID es un campo que aumenta automáticamente). El proceso almacenado devuelve diferentes valores dependiendo de si el usuario lo tiene o no. En este punto, el proceso almacenado y el código ASP son los siguientes:
/*SP5*/
CREAR PROCEDIMIENTO DBO.GETUSERNAME
--Para profundizar la impresión del orden, invierta el orden de definición de los dos parámetros siguientes.
@USERNAME VARCHAR(40) SALIDA,
@USERIDINT
COMO
ESTABLECER SIN CUENTA EN
COMENZAR
SI @USERID ES DEVOLUCIÓN NULA
SELECCIONAR @NOMBRE DE USUARIO = NOMBRE DE USUARIO
DE DBO.[INFO USUARIO]
DONDE IDUSUARIO=@IDUSUARIO
SI @@ROWCOUNT>0
VOLVER 1
DEMÁS
VOLVER 0
DEVOLVER
FIN
IR
'**Llamar a un proceso almacenado con valor de retorno, parámetros de entrada y parámetros de salida**
DIM MYCOMM, ID DE USUARIO, NOMBRE DE USUARIO
ID DE USUARIO = 1
ESTABLECER MICOMM = SERVIDOR.CREATEOBJECT(ADODB.COMMAND)
CON MYCOMM
.ACTIVECONNECTION = MYCONSTR 'MYCONSTR es la cadena de conexión de la base de datos
.COMMANDTEXT = GETUSERNAME 'Especifique el nombre del proceso almacenado
.COMMANDTYPE = 4 'Indica que este es un proceso almacenado
.PREPARED = TRUE 'Requiere que los comandos SQL se compilen primero
'El valor de retorno debe declararse primero
.PARAMETERS.APPEND .CREATEPARAMETER(RETORNO,2,4)
'El orden de declaración de los dos parámetros siguientes también se invierte en consecuencia.
.PARAMETERS.APPEND .CREATEPARAMETER(@NOMBRE DE USUARIO,200,2,40)
.PARAMETERS.APPEND .CREATEPARAMETER(@USERID,3,1,4,USERID)
.EJECUTAR
TERMINAR CON
SI MYCOMM(0) = 1 ENTONCES
NOMBRE DE USUARIO = MICOM(1)
DEMÁS
NOMBRE DE USUARIO = Este usuario no tiene
FINALIZAR SI
ESTABLECER MYCOMM = NADA
6. Proceso almacenado que devuelve parámetros y conjunto de registros al mismo tiempo.
A veces, necesitamos que el proceso de almacenamiento devuelva parámetros y conjuntos de registros al mismo tiempo. Por ejemplo, cuando utilizamos el proceso de almacenamiento para paginación, necesitamos devolver parámetros como conjuntos de registros y volumen total de datos al mismo tiempo. El siguiente es un proceso almacenado para paginación:
/*SP6*/
CREAR PROCEDIMIENTO DBO.GETUSERLIST
@IPAGECOUNT INT OUTPUT, --Número total de páginas
@IPAGE INT, --Número de página actual
@IPAGESIZE INT --Número de registros por página
COMO
ESTABLECER SIN CUENTA EN
COMENZAR
--Crear tabla temporal
CREAR TABLA #T (ID INT IDENTIDAD, campo de incremento automático
ID DE USUARIO INT,
NOMBRE DE USUARIO VARCHAR(40))
--Escribir datos en una tabla temporal
INSERTAR EN #T
SELECCIONE ID DE USUARIO, NOMBRE DE USUARIO DE DBO.[INFO DE USUARIO]
PEDIR POR ID DE USUARIO
--Obtener el número total de registros
DECLARAR @IRECORDCOUNT INT
ESTABLECER @IRECORDCOUNT = @@ROWCOUNT
--Determinar el número total de páginas.
SI @IRECORDCOUNT%@IPAGESIZE=0
CONFIGURAR @IPAGECOUNT=TECHO(@IRECORDCOUNT/@IPAGESIZE)
DEMÁS
SET @IPAGECOUNT=TECHO(@IRECORDCOUNT/@IPAGESIZE)+1
--Si el número de página solicitado es mayor que el número total de páginas, se mostrará la última página
SI @IPAGE > @IPAGECOUNT
SELECCIONE @IPAGE = @IPAGECOUNT
--Determinar los registros de inicio y fin de la página actual
DECLARAR @ISTART INT --INICIAR REGISTRO
DECLARAR @IEND INT --END REGISTRO
SELECCIONE @ISTART = (@IPAGE - 1) * @IPAGESIZE
SELECCIONE @IEND = @ISTART + @IPAGESIZE + 1
--Obtener el registro de la página actual
SELECCIONE * DE #T DONDE ID>@ISTART E ID<@IEND
--Eliminar tabla temporal
TABLA DE CAÍDA #T
--Devuelve el número total de registros
REGRESAR @IRECORDCOUNT
FIN
IR
En el proceso de almacenamiento anterior, ingrese el número de página actual y el número de registros por página, y devuelva el conjunto de registros de la página actual, el número total de páginas y el número total de registros. Para ser más típico, el número total de registros se devuelve como valor de retorno. El siguiente es el código ASP que llama al proceso almacenado (se omite la operación de paginación específica):
'**Proceso de almacenamiento de paginación de llamadas**
DIM PAGENOW, PAGESIZE, PAGECOUNT, RECORDCOUNT
DIM MYCOMM,MYRST
PÁGINA AHORA = SOLICITUD(PN)
'Función personalizada utilizada para verificar números naturales
SI CHECKNAR(PAGENOW) = FALSO ENTONCES PAGENOW = 1
TAMAÑO DE PÁGINA = 20
ESTABLECER MICOMM = SERVIDOR.CREATEOBJECT(ADODB.COMMAND)
CON MYCOMM
.ACTIVECONNECTION = MYCONSTR 'MYCONSTR es la cadena de conexión de la base de datos
.COMMANDTEXT = GETUSERLIST 'Especifique el nombre del proceso almacenado
.COMMANDTYPE = 4 'Indica que este es un proceso almacenado
.PREPARED = TRUE 'Requiere que los comandos SQL se compilen primero
'Valor de retorno (número total de registros)
.PARAMETERS.APPEND .CREATEPARAMETER(RETORNO,2,4)
'Parámetros de salida (número total de páginas)
.PARAMETERS.APPEND .CREATEPARAMETER(@IPAGECOUNT,3,2)
'Parámetros de entrada (número de página actual)
.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)
ESTABLECER MYRST = .EJECUTAR
TERMINAR CON
IF MYRST.STATE = 0 THEN 'No se obtuvieron datos, MYRST está cerrado
RECUENTO DE REGISTROS = -1
DEMÁS
MYRST.CLOSE 'Nota: Para obtener valores de parámetros, primero debe cerrar el objeto del conjunto de registros
RECORDCOUNT = MICOMUNICACIÓN(0)
CUENTA DE PÁGINAS = MICOMUNICACIÓN(1)
SI CINT(PAGENOW)>=CINT(PAGECOUNT) ENTONCES PAGENOW=PAGECOUNT
FINALIZAR SI
ESTABLECER MYCOMM = NADA
'Mostrar registros a continuación
SI RECORDCOUNT = 0 ENTONCES
RESPUESTA.ESCRIBIR Sin registro
ELSEIF RECORDCOUNT > 0 ENTONCES
MYRST.ABIERTO
HACER HASTA MYRST.EOF
...
BUCLE
'Lo siguiente muestra información de paginación
...
DE LO CONTRARIO 'RECORDCOUNT=-1
Error del parámetro RESPONSE.WRITE
FINALIZAR SI
Con respecto al código anterior, solo hay un punto que debe explicarse: al devolver el conjunto de registros y los parámetros al mismo tiempo, si desea obtener los parámetros, primero debe cerrar el conjunto de registros y luego abrirlo cuando use el conjunto de registros.
7. Proceso almacenado que devuelve múltiples conjuntos de registros
Este artículo presenta primero el proceso almacenado que devuelve un conjunto de registros. A veces, un proceso almacenado necesita devolver varios conjuntos de registros en ASP, ¿cómo obtener estos conjuntos de registros al mismo tiempo? Para ilustrar este problema, agregue dos campos a la tabla USERINFO: USERTEL y USERMAIL, y configure que solo los usuarios que hayan iniciado sesión puedan ver estos dos contenidos.
/*SP7*/
CREAR PROCEDIMIENTO DBO.GETUSERINFO
@USERIDINT,
@CHECKLOGIN BIT
COMO
ESTABLECER SIN CUENTA EN
COMENZAR
SI @USERID ES NULO O @CHECKLOGIN ES NULO DEVOLVER
SELECCIONAR NOMBRE DE USUARIO
DE DBO.[USRINFO]
DONDE IDUSUARIO=@IDUSUARIO
--Si es un usuario registrado, tome USERTEL y USERMAIL
SI @CHECKLOGIN=1
SELECCIONAR TEL DE USUARIO, CORREO DE USUARIO
DE DBO.[INFO USUARIO]
DONDE IDUSUARIO=@IDUSUARIO
DEVOLVER
FIN
IR
El siguiente es el código ASP:
'**Llamar a un proceso almacenado que devuelve múltiples conjuntos de registros**
DIM CHECKLG, ID DE USUARIO, NOMBRE DE USUARIO, TEL DE USUARIO, CORREO DE USUARIO
DIM MYCOMM,MYRST
ID DE USUARIO = 1
'CHECKLOGIN() es una función personalizada para determinar si el visitante ha iniciado sesión
VERIFICAR = VERIFICAR INICIAR SESIÓN()
ESTABLECER MICOMM = SERVIDOR.CREATEOBJECT(ADODB.COMMAND)
CON MYCOMM
.ACTIVECONNECTION = MYCONSTR 'MYCONSTR es la cadena de conexión de la base de datos
.COMMANDTEXT = GETUSERINFO 'Especifique el nombre del proceso almacenado
.COMMANDTYPE = 4 'Indica que este es un proceso almacenado
.PREPARED = TRUE 'Requiere que los comandos SQL se compilen primero
.PARAMETERS.APPEND .CREATEPARAMETER(@USERID,3,1,4,USERID)
.PARAMETERS.APPEND .CREATEPARAMETER(@CHECKLOGIN,11,1,1,CHECKLG)
ESTABLECER MYRST = .EJECUTAR
TERMINAR CON
ESTABLECER MYCOMM = NADA
'Obtiene el valor del primer conjunto de registros
NOMBRE DE USUARIO = MIRSTA(0)
'Obtiene el valor del segundo conjunto de registros
SI NO MYRST ES NADA ENTONCES
ESTABLECER MIRST = MYRST.NEXTRECORDSET()
USERTEL = MIRSTA(0)
CORREO DE USUARIO = MIRSTA(1)
FINALIZAR SI
ESTABLECER MYRST = NADA
En el código anterior, el método NEXTRECORDSET del objeto RECORDSET se utiliza para obtener múltiples conjuntos de registros devueltos por el proceso de almacenamiento.
Hasta ahora, este artículo ha dado una explicación relativamente completa de varias situaciones en las que ASP llama a procesos almacenados. Finalmente, hablemos de los diferentes métodos para llamar a múltiples procesos almacenados en un programa ASP.
En un programa ASP, al menos los siguientes tres métodos son factibles para llamar a múltiples procesos almacenados:
1. Crea múltiples objetos COMMAND
DIMMYCOMM
ESTABLECER MICOMM = SERVIDOR.CREATEOBJECT(ADODB.COMMAND)
'Llamar al proceso almacenado uno
...
ESTABLECER MYCOMM = NADA
ESTABLECER MICOMM = SERVIDOR.CREATEOBJECT(ADODB.COMMAND)
'Llamar al proceso almacenado dos
...
ESTABLECER MYCOMM = NADA
...
2. Cree solo un objeto COMMAND y borre sus parámetros al finalizar una llamada.
DIMMYCOMM
ESTABLECER MICOMM = SERVIDOR.CREATEOBJECT(ADODB.COMMAND)
'Llamar al proceso almacenado uno
.....
'Borrar parámetros (asumiendo que hay tres parámetros)
PARÁMETROS MICOMUNICACIÓN.BORRAR 2
PARÁMETROS MICOMUNICACIÓN.BORRAR 1
PARÁMETROS MICOMUNICACIÓN.BORRAR 0
'Llamar al proceso almacenado dos y borrar los parámetros
...
ESTABLECER MYCOMM = NADA
En este momento, tenga en cuenta: el orden de borrado de parámetros es opuesto al orden de declaración de parámetros. No sé el motivo.
3. Utilice el método REFRESH de la recopilación de datos PARAMETERS para restablecer el objeto PARAMETER
DIMMYCOMM
ESTABLECER MICOMM = SERVIDOR.CREATEOBJECT(ADODB.COMMAND)
'Llamar al proceso almacenado uno
.....
'Restablecer todos los objetos PARAMETER contenidos en la colección de datos PARAMETERS
PARÁMETROS.MYCOMM.ACTUALIZAR
'Llamar al proceso almacenado dos
.....
ESTABLECER MYCOMM = NADA
En general, se cree que crear objetos repetidamente es un método menos eficiente, pero después de realizar la prueba (la herramienta de prueba es MICROSOFT APPLICATION CENTER TEST), los resultados son inesperados:
Método 2 >= Método 1 >> Método 3
La velocidad de ejecución del método 2 es mayor o igual que la del método 1 (hasta aproximadamente un 4% más alta). La velocidad de ejecución de estos dos métodos es mucho más rápida que la del método 3 (hasta un 130%). método 1 cuando hay muchos parámetros. Si no, utilice el método 2.
Me tomó un día finalmente poner por escrito algo de mi experiencia superficial en llamar a procedimientos almacenados en ASP. Entre ellos, de algunos solo conozco los efectos pero no las causas, y algunos pueden estar equivocados, pero todos ellos se deben a mi práctica personal. Por favor, acéptenlo con espíritu crítico, lectores. Si tiene alguna opinión diferente, hágamelo saber. Gracias de antemano.