sábado, 16 de abril de 2016

Procedimientos almacenados con SQL Server. 1ª Parte

Creación

Existen dos formas de crear procedimientos almacenados:
Utilizando la sentencia CREATE PROCEDURE o a través del Administrador corporativo.

Procedimientos almacenados SQL Server

Creación de procedimientos almacenados mediante comandos

CREATE PROCEDURE. Permite crear un procedimiento almacenado a partir de una serie de sentencias SQL unidas por sentencias adicionales de control de flujo. La sintaxis resumida de esta sentencia es la siguiente:

CREATE PROCEDURE [propietario.] nombre_procedimiento(;número)
((lista_de_parametros)) FOR REPLICATION) | (WITH RECOMPILE)
[([WITH] 1 (,]) ENCRYPTION]] AS sentencias SQL

El nombre del procedimiento será un identificador para el mismo, no puede superar los 128 caracteres de longitud.
Ejemplo de creación de un procedimiento almacenado:

CREATE PROCEDURE [Dbo].[Nombre_Procedimiento]
     @strVariable1      Char(4),
     @strVariable2       VarChar(12),
     @bteBit            bit
AS   
  /*Secuencia de sentencias de SQL Server. La secuencia mostrada es un ejemplo sencillo y se puede complicar tanto como queramos */
  IF @bteBit = 1  
    SELECT strCampo1, strCampo2, strCampo3
      FROM dbo.tbTabla
      WHERE strCampo1 = @strVariable1 AND strCampo2 = @strVariable2 AND                     strCampo3 Is Not NULL

   ELSE   /* si la variable de entrada no es 1 */
     SELECT strCampo1, strCampo2, strCampo3
      FROM dbo.tbTabla
      WHERE strCampo1 = @strVariable1 AND strCampo2 = @strVariable2 AND                      strCampo3 Is NULL

  RETURN


Es posible cambiar el nombre de un procedimiento almacenado, pero no se dispone de una sentencia específica, por lo que hay que hacerlo ejecutando el procedimiento almacenado de sistema sp_rename del siguiente modo:
 sp_rename nombre_antiguo, nombre_nuevo
Una vez creado el procedimiento almacenado podemos ejecutarlo desde el administrador de consultas o desde un programa externo utilizando la cláusula EXECUTE del siguiente modo:
EXECUTE sp_Nombre_Procedimiento ('Valor_variable1', 1, 'Valor_variable3', True)

(El 1 y True es un valor numérico y otro booleano respectivamente, esto es un ejemplo, los valores de cada variable se ajustarán al tipo determinado en el procedimiento)
Una vez creado, el procedimiento almacenado se puede modificar con la cláusula ALTER PROCEDURE al ejecutar esta cláusula, SQL server modificará el procedimiento almacenado con las modificaciones introducidas en él.

Agrupamiento de procedimientos almacenados

En una base de datos suele existir un conjunto de procedimientos diseñados para realizar tareas relacionadas, de manera que sólo tengan sentido de forma conjunta. Para estas situaciones SQL Server permite agrupar un conjunto de procedimientos almacenados de manera que puedan ser eliminados con una sola sentencia DROP PROCEDURE para ello, es necesario asignar a todos esos procedimientos el mismo nombre, al que se añade un punto y coma con un número identificativo.

--Crea tres procedimientos almacenados con el mismo nombre pero distinguidos por el numeral.
CREATE PROCEDURE Nombre_Procedimiento; 1

CREATE PROCEDURE Nombre_Procedimiento; 2

CREATE PROCEDURE Nombre_Procedimiento; 3

--Elimina de una sola vez todos los procedimientos almacenados relacionados con el mismo nombre.
DROP PROCEDURE Nombre_Procedimiento

Parámetros

Los procedimientos almacenados permiten que su ejecución se adapte a la situación en el que son llamados. Los procedimientos pueden recibir parámetros como las funciones de los lenguajes de programación. De este modo el procedimiento puede recibir datos en función de la situación en se realice la llamada. Los parámetros se definen en su creación y cada procedimiento puede recibir hasta 2.100 parámetros.
Cuando se ejecuta un procedimiento  con parámetros, es necesario suministrar los valores para ellos. La sintaxis de definición de un parámetro es la siguiente:
@Parametro tipo_de_datos (= valor por defecto) [OUTPUT]
El nombre de parámetro, aparece precedido por el carácter @. Este carácter pertenece al nombre del parámetro. Debe especificarse un tipo de datos para cada uno de los parámetros. Puede especificarse un valor por defecto para cada parámetro.  Se hace colocando después del nombre de parámetro el signo =  seguido por la constante que se utilizará como valor.
Parámetros de retorno. Se especifican como cualquier otro parámetro pero al final se añade la palabra OUTPUT. Cuando se ejecuta el procedimiento estos parámetros devolverán el valor que han tomado en la ejecución, estos valores se pueden almacenar en variables.

Procedimientos de recompilación forzosa. RECOMPILE

Los procedimientos almacenados se compilan, es decir, se genera una estrategia optimizando el acceso a los datos que se solicitarán sólo la primera vez que son ejecutados.
Si generamos un procedimiento almacenado con parámetros de tipos diversos. Esto supone que sea común que la optimización que se ha llevado a cabo en primera instancia no sea válida para otras ejecuciones del procedimiento. Por otra parte, es común que frecuentemente se añadan nuevos índices que hagan que la optimización de la consulta deje de ser válida. En estas situaciones la estrategia originalmente diseñada deja de tener validez y es preciso recompilar el procedimiento de nuevo, para ello podemos añadir al procedimiento almacenado la cláusula WITH RECOMPILE.

CREATE PROCEDURE [Dbo].[Nombre_Procedimiento]
     @strVariable1        Char(4),
     @strVariable2       VarChar(12),
     @bteBit         bit
WITH RECOMPILE
AS   
  /*Secuencia de sentencias de SQL Server.

Si no queremos que se recompile cada vez que se ejecute pero si la siguiente vez pues hemos creado un nuevo índice, podemos utilizar el procedimiento almacenado de sistema sp_recompile.

EXEC sp_recompile 'Dbo.Sp_Mi_Procedimient_Almacenado'

Procedimientos de descripción encriptada. ENCRYPTION

Cada procedimiento almacenado que se crea aparece en la tabla de sistema sys.syscomments como una fila en la que se almacena la descripción que se proporcionó al crearlo, de manera que dicho procedimiento queda recreado en esta tabla. Es posible encriptar esta descripción del procedimiento utilizando la cláusula WITH ENCRYPTION.

CREATE PROCEDURE [Dbo].[Nombre_Procedimiento]
     @strVariable1        Char(4),
     @strVariable2       VarChar(12),
     @bteBit         bit
WITH ENCRYPTION
AS   
  /*Secuencia de sentencias de SQL Server.

Permisos de creación

Sólo puede crear procedimientos almacenados el propietario de la base de datos aunque también puede transferir este privilegio a otros usuarios.

Sentencias SQL del procedimiento almacenado

El cuerpo del procedimiento está formado por un conjunto de sentencias SQL que realizarán las tareas que esperamos del mismo y son las que se ponen después de la cláusula AS. Los Procedimientos Almacenados pueden ocupar hasta un máximo de 250 Mb.

Sentencias admisibles

En general un procedimiento almacenado admite cualquier número y tipo de sentencias de SQL aunque existen algunas restricciones:

Sentencias de creación.
No pueden incluirse sentencias para crear objetos como

CREATE VIEW.
CREATE TRIGGER.
CREATE DEFAULT.
CREATE PROCEDURE.
CREATE RULE.

El resto de objetos de bases de datos sí pueden ser creados en un procedimiento almacenado, incluyendo tablas temporales.

Sentencias de eliminación de objetos.
La familia de sentencias DROP si está permitida.

Creación de tablas temporales.
Igual que pueden crearse tablas permanentes, también está permitido crear tablas temporales, pero sólo tendrán sentido durante el tiempo de ejecución del procedimiento.

Calificación de nombres

Los procedimientos almacenados pueden ser ejecutados por usuarios diferentes a los propietarios de los objetos a los que se hace referencia en interior de los mismos. El nombre del propietario de objeto forma parte de su nombre, aunque a veces se puede omitir. Un identificador de un objeto está calificado cuando se especifica manera explícita el identificador del propietario del mismo.
Los nombres de los objetos a los que se hace referencia en un procedimiento almacenado pueden resolverse en el momento de la definición del procedimiento o durante su ejecución, dependiendo del tipo de sentencia que se esté ejecutando.

Sentencias que se resuelven en tiempo de ejecución:
ALTER TABLE
CREATE TABLE
DROP TABLE
TRUNCATE TABLE
CREATE INDEX
DROP INDEX
UPDATE STATISTICS
Si la resolución se produce en tiempo de ejecución, los nombres de los objetos a los que se haga referencia deberán estar calificados, es decir con el propietario especificado delante del nombre, pues si no, el gestor actuará de forma errónea.
De este modo si un usuario hace uso de un procedimiento almacenado que hace uso,  de una tabla sin calificar, y posee él mismo en su propietario una tabla con el mismo nombre, el gestor utilizará esta tabla en vez de la que el creador del procedimiento almacenado había previsto.
En los ejemplos anteriores siempre poníamos

SELECT strCampo1, strCampo2, strCampo3
      FROM dbo.tbTabla
Pues si ponemos

SELECT strCampo1, strCampo2, strCampo3
      FROM tbTabla

Y el usuario que lo ejecuta tiene un propietario diferente de dbo pero una tabla llamada tbTabla, entonces hará uso de esta y no de la que se especifica en el procedimiento almacenado.

Creación de procedimientos almacenados mediante el Administrador Corporativo

Para crear directamente un procedimiento almacenado mediante el Administrador Corporativo. Debemos entrar en el  servidor y en la base de datos en los que vamos a crear el procedimiento, en el Administrador Corporativo. Seleccionamos el nodo Procedimientos almacenados, y, al pulsar con el botón derecho del ratón, seleccionamos del menú Nuevo procedimiento almacenado.

crear un procedimiento almacenado SQL Server

Escribimos las sentencias de creación del procedimiento almacenado sobre la plantilla que nos genera  y cuando terminamos podemos pulsar el botón depurar para comprobar la sintaxis y asegurarnos de que la sentencia es correcta.

Depurar y ejecutar un procedimiento almacenado SQL Server

Pulsar el botón Ejecutar para que procedimiento se cree con el nombre especificado en la sentencia. Una vez creado podremos modificar sus permisos de ejecución posicionándonos sobre el procedimiento almacenado y pulsando el botón derecho del ratón donde nos saldrá el menú.

modificar un procedimiento almacenado SQL Server

Si pulsamos modificar nos abrirá el código del procedimiento almacenado en el área de trabajo donde podremos modificarlo testearlo y guardarlo como se ha explicado más arriba. Si queremos entre otras cosas modificar sus permisos, entonces pulsaremos en el menú la opción propiedades la cual nos abrirá un cuadro de diálogo como el mostrado abajo. En la pestaña permisos aparecen estos donde podremos modificarlos.

Permisos de un procedimiento almacenado

En la pestaña general podremos ver las características principales del procedimiento almacenado.

Eliminación de procedimientos almacenados

La sentencia DROP PROCEDURE sirve para eliminar de la base de datos un procedimiento almacenado y su sintaxis y uso resulta totalmente análogo a las que se utilizan para eliminar cualquier otro objeto de una base de datos. Excepto lo que ya se comentó sobre los procedimientos almacenados agrupados. Este tipo de procedimientos se eliminan conjuntamente con  una sola sentencia DROP PROCEDURE.

No hay comentarios:

Publicar un comentario