jueves 10 de noviembre de 2011
Uso de lotes y lenguaje de control de flujo
Transact-SQL permite agrupar una serie de instrucciones como un lote, ya sea de forma interactiva o desde un archivo del sistema operativo. También se pueden utilizar las estructuras de control de flujo ofrecidas por Transact-SQL para conectar las instrucciones utilizando estructuras de tipo de programación.
En este capítulo se trata lo siguiente:
· Una introducción general a los lotes y al lenguaje de control de flujo
· Las reglas asociadas con el uso de instrucciones en lotes
· Uso del lenguaje de control de flujo
Definición de lote y de lenguaje de control de flujo
Hasta aquí, cada ejemplo de la Guía del Usuario de Transact-SQL consistió de una instrucción individual. Las instrucciones individuales se ejecutan en SQL Server de una en una, introduciendo instrucciones y recibiendo resultados de forma interactiva. SQL Server también puede procesar instrucciones múltiples ejecutadas como un lote, tanto de forma interactiva como desde un archivo.
Un lote de instrucciones SQL se termina mediante una señal de fin de lote que indica a SQL Server que continúe y ejecute las instrucciones. La señal de fin de lote para la utilidad SQL autónoma isql es la palabra "go" sola en una línea. Para obtener más detalles, consulte el manual de programas de utilidad de SQL Server.
Desde el punto de vista técnico, una sola instrucción SQL puede constituir un lote, pero normalmente se piensa en un lote como un conjunto de instrucciones múltiples. Con frecuencia, un lote de instrucciones se escribe en un archivo del sistema operativo antes de enviarse a isql .
Transact-SQL proporciona palabras clave especiales llamadas lenguaje de control de flujo que permiten controlar el flujo de ejecución de las instrucciones. El lenguaje de control de flujo se puede utilizar en instrucciones sencillas, lotes, procedimientos almacenados y disparadores.
El lenguaje de control de flujo, como if...else para la ejecución condicional de comandos y while para la ejecución repetitiva, permite refinar y controlar el funcionamiento de las instrucciones SQL. El lenguaje de control de flujo de Transact-SQL transforma el SQL estándar en un lenguaje de programación de muy alto nivel.
Reglas asociadas a lotes
Existen reglas que controlan qué instrucciones SQL pueden combinarse en un solo lote. Estas reglas de lotes incluyen lo siguiente:
- Algunos comandos de base de datos no pueden combinarse con otras instrucciones en un lote. Se trata de los siguientes: create procedure create rule create default create trigger create view
- Los comandos que sí pueden combinarse con otras instrucciones SQL en un lote incluyen: create database (salvo que no puede crear una base de datos y generar o acceder a los objetos de la base de datos nueva en un solo lote) create table create index
- Las reglas y valores predeterminados no pueden vincularse a columnas y utilizarse durante el mismo lote. sp_bindrule y sp_bindefault no pueden estar en el mismo lote que las instrucciones insert que ejecutan la regla o valor predeterminado.
- use debe ejecutarse en un lote anterior antes que las instrucciones que hacen referencia a los objetos de dicha base de datos.
- No es posible realizar una operación drop con un objeto y después hacer referencia a éste o volver a crearlo en el mismo lote.
- Cualquier opción definida con una instrucción set tendrá efecto al final del lote. Es posible combinar instrucciones set y consultas en el mismo lote, pero las opciones de set no se aplicarán a las consultas de dicho lote.
Ejemplos del uso de lotes
Los ejemplos de esta sección describen lotes que utilizan el formato de la utilidad isql , que tiene una clara señal de fin de lote: la palabra "go" sola en una línea. A continuación se muestra un lote que contiene dos instrucciones select en un solo lote:
select count(*) from titles
select count(*) from authors
go
-------------
18
(1 row affected)
-------------
23
(1 row affected)
Se puede crear una tabla y hacer referencia a ella en el mismo lote. Este lote crea una tabla, inserta una fila en ella y después selecciona todo lo que contiene:
create table test
(column1 char(10), column2 int)
insert test
values ("hello", 598)
select * from test
go
(1 row affected)
column1 column2
------- -------
hello 598
(1 row affected)
Una instrucción create view debe ser la única instrucción de un lote. Este lote contiene una sola instrucción, que crea una vista:
create view testview as
select column1 from test
go
Se puede combinar una instrucción use con otras instrucciones siempre que los objetos a los que haga referencia en las instrucciones subsiguientes estén en la base de datos donde empezó. Este lote selecciona de una tabla de la base de datos master y después abre la base de datos pubs 2 . El lote supone que se encuentra en la base de datos master del principio. Tras la ejecución del lote, pubs2 es la base de datos actual.
select count(*) from sysdatabases
use pubs2
go
-------------
9
(1 row affected)
Se puede combinar una instrucción drop con otras instrucciones siempre que no haga referencia o vuelva a crear el objeto omitido en el mismo lote. El ejemplo de lote final combina una instrucción drop con otraselect :
drop table test
select count(*) from titles
go
------------
18
(1 row affected)
Si hay un error de sintaxis en algún punto del lote, no se ejecutará ninguna de las instrucciones. Por ejemplo, a continuación se muestra un lote con un error de escritura en la última instrucción, y los resultados:
select count(*) from titles
select count(*) from authors
slect count(*) from publishers
go
Msg 156, Level 15, State 1:
SQL Server 'MAGOO', LIne 3:
Sintaxis incorrecta junto a la palabra clave 'count'.
Los lotes que violan una regla del lote también generan mensajes de error. A continuación se muestran algunos ejemplos de lotes ilegales:
create table test
(column1 char(10), column2 int)
insert test
values ("hello", 598)
select * from test
create view testview as select column1 from test
go
Msg 111, Level 15, State 3:
Server 'hq', Line 6:
CREATE VIEW debe ser el primer comando en un batch de consulta.
create view testview as select column1 from test
insert testview values ("goodbye")
go
Msg 127, Level 15, State 1:
Server 'hq', Procedure 'testview', Line 3:
Este CREATE puede sólo contener 1 sentencia.
El siguiente lote funcionará si todavía está en la base de datos especificada en la instrucción use . Si lo intenta desde otra base de datos como master , recibirá un mensaje de error.
use pubs2
select * from titles
go
Msg 208, Level 16, State 1:
Server 'hq', Line 2:
Invalid object name 'titles'.
drop table test
create table test
(column1 char(10), column2 int)
go
Msg 2714, Level 16, State 1:
Server 'hq', Line 2:
Ya hay un objeto llamado 'test' en la base de datos.
Lotes enviados como archivos
Se pueden enviar uno o más lotes de instrucciones SQL a isql desde un archivo del sistema operativo. Un archivo puede incluir más de un lote, es decir, más de una serie de instrucciones, cada uno terminado con la palabra "go".
Por ejemplo, un archivo del sistema operativo podría contener los siguientes tres lotes:
use pubs2
go
select count(*) from titles
select count(*) from authors
go
create table test
(column1 char(10), column2 int)
insert test
values ("hello", 598)
select * from test
go
Estos son los resultados de enviar este archivo a la utilidad isql :
-------------
18
(1 row affected)
-------------
23
(1 row affected)
(1 row affected)
column1 column2
--------- ---------
hello 598
(1 row affected)
Consulte la sección sobre la utilidad isql del manual de programas de utilidad de SQL Server para obtener información específica del entorno sobre la ejecución de lotes almacenados en archivos.
Lotes enviados como archivos
Un lote es un grupo de una o más instrucciones Transact-SQL enviadas al mismo tiempo desde una aplicación a SQL Server para su ejecución. SQL Server compila las declaraciones de un lote en una sola unidad ejecutable, llamado un plan de ejecución. Las afirmaciones contenidas en el plan de ejecución se ejecutan de una en una.
Cada instrucción de Transact-SQL se deben terminar con un punto y coma. Este requisito no se cumple, pero la capacidad para poner fin a una declaración sin un punto y coma está en desuso y pueden ser removidos en una versión futura de Microsoft SQL Server.
Un error de compilación, como un error de sintaxis, impide la elaboración del plan de ejecución. Por lo tanto, no las instrucciones del lote se ejecutan.
Un error en tiempo de ejecución, como un desbordamiento aritmético o una violación de restricción, tiene uno de los siguientes efectos:
· La mayoría de errores de ejecución detener el estado de cuenta actual y los estados que le siguen en el lote.
· Algunos de los errores en tiempo de ejecución, tales como violaciónes restricción, sólo se detiene la instrucción actual. Todas las sentencias restantes en el lote se ejecutan.
Las declaraciones que se ejecutan antes de la declaración que encontró el error en tiempo de ejecución no se verán afectados. La única excepción es cuando el lote se encuentra en una transacción y el error hace que la transacción se deshace. En este caso, cualquier modificación de los datos no confirmados que se hacen antes de que el error en tiempo de ejecución se deshacen.
Por ejemplo, supongamos que hay 10 estados en un lote. Si la sentencia de quinto tiene un error de sintaxis, no las instrucciones del lote se ejecutan. Si se compila el lote y la segunda declaración luego no durante la ejecución, los resultados de la primera declaración no se ven afectados porque ya se ha ejecutado.
Reglas para el uso de lotes
Las siguientes reglas se aplican al uso de los lotes:
· CREATE DEFAULT, CREATE FUNCTION, CREATE PROCEDURE, CREATE RULE, CREATE SCHEMA, CREATE TRIGGER y CREATE VIEW no se pueden combinar con otras declaraciones en un lote. La sentencia CREATE debe iniciar el proceso por lotes. Todas las declaraciones que siguen en ese lote será interpretado como parte de la definición de la sentencia CREATE primero.
· Una tabla no puede ser cambiado y después se hace referencia las nuevas columnas en el mismo lote.
· Si una instrucción EXECUTE es la primera instrucción de un lote, la palabra clave EXECUTE no es necesario. La palabra clave EXECUTE es necesario si la instrucción EXECUTE no es la primera declaración en el lote.
Lotes enviados como archivos
Se pueden enviar uno o más lotes de instrucciones SQL a isql desde un archivo del sistema operativo. Un archivo puede incluir más de un lote, es decir, más de una serie de instrucciones, cada uno terminado con la palabra "go".
Por ejemplo, un archivo del sistema operativo podría contener los siguientes tres lotes:
use pubs2
go
select count(*) from titles
select count(*) from authors
go
create table test
(column1 char(10), column2 int)
insert test
values ("hello", 598)
select * from test
go
Estos son los resultados de enviar este archivo a la utilidad isql :
-------------
18
(1 row affected)
-------------
23
(1 row affected)
(1 row affected)
column1 column2
--------- ---------
hello 598
(1 row affected)
Uso del lenguaje de control de flujo
El lenguaje de control de flujo se puede utilizar con instrucciones interactivas, en lotes y en procedimientos almacenados. El control de flujo y las palabras clave relacionadas y sus funciones son:
Tabla 13-1: Control de flujo y palabras clave relacionadas | |
Palabra clave | Función |
if | Define una ejecución condicional. |
...else | Define una ejecución alternativa cuando la condición if es falsa. |
begin | Comienzo de un bloque de instrucciones. |
...end | Final de un bloque de instrucciones. |
while | Repite la ejecución de instrucciones mientras la condición es verdadera. |
break | Sale del final del siguiente bucle while más exterior. |
...continue | Reinicio del bucle while . |
declare | Declara variables locales. |
goto label | Va a un rótulo ( label:) , una posición en un bloque de instrucciones. |
return | Sale de forma incondicional. |
waitfor | Define el retardo para la ejecución del comando. |
print | Imprime un mensaje definido por el usuario o una variable local en la pantalla del usuario. |
raiserror | Imprime un mensaje definido por el usuario o una variable local en la pantalla del usuario y define un indicador del sistema en la variable global @@ error . |
/* coment ario */ | Inserta un comentario en cualquier punto de una instrucción SQL. |
if ... else
La palabra clave if , con o sin la compañía de else , se utiliza para introducir una condición que determina si se ejecutará la instrucción siguiente. La instrucción SQL se ejecuta si la condición se cumple, es decir, si devuelve TRUE (verdadero).
La palabra clave else introduce una instrucción SQL alternativa que se ejecuta cuando la condición if devuelve FALSE (falso).
La sintaxis para if y else es:
if
boolean_expression
statement
[else
[if boolean_expression ]
statement ]
Una expresión booleana es una expresión que devuelve TRUE o FALSE. En ella se puede incluir un nombre de columna, una constante, cualquier combinación de nombres de columna y constantes conectados por operadores aritméticos o basados en bits, o una subconsulta, siempre que ésta devuelva un solo valor. Si la expresión booleana contiene una instrucción select , debe incluirse entre paréntesis y devolver un solo valor.
A continuación se muestra un ejemplo del uso de if sola:
if exists (select postalcode from authors
where postalcode = '94705')
print "Berkeley author"
Las pruebas if pueden estar anidadas dentro de otras pruebas if , ya sea dentro de otra construcción if o después de una else . La expresión de la prueba if sólo puede devolver un valor. Además, para cada estructura if...else , puede existir una instrucción select para if y otra para else . Para incluir más de una instrucción select , hay que utilizar las palabras clave begin...end . El número máximo de pruebas if que pueden anidarse varía con la complejidad de las instrucciones select (u otras estructuras de lenguaje) que se incluyan con cada estructura if...else .
begin...end
Las palabras clave begin y end se utilizan para englobar una serie de instrucciones a fin de que sean tratadas como una unidad por las estructuras de control de flujo como if...else . Una serie de instrucciones englobadas por begin y end se denomina bloque de instrucciones .
La sintaxis de begin...end es:
begin
statement block
end
He aquí un ejemplo:
if (select avg(price) from titles) < $15
begin
update titles
set price = price * 2
select title, price
from titles
where price > $28
end
Sin begin ni end , la condición if sólo se aplicaría a la primera instrucción SQL. La segunda instrucción se ejecutaría independientemente de la primera.
Los bloques begin ... end pueden anidarse dentro de otros bloques begin...end .
while y break...continue
while se utiliza para definir una condición para la ejecución repetida de una instrucción o un bloque de instrucciones. Las instrucciones se ejecutan reiteradamente siempre que la condición especificada sea verdadera.
La sintaxis es:
while boolean_expression
statement
En este ejemplo, las instrucciones select y update se repiten siempre que el precio promedio permanezca por debajo de $30:
while (select avg(price) from titles) < $30
begin
select title_id, price
from titles
where price > $20
update titles
set price = price * 2
end
break y continue controlan el funcionamiento de las instrucciones dentro de un bucle while . break permite salir del bucle while . Todas las instrucciones que aparecen después de la palabra clave end , que marca el final del bucle, se ejecutan. continue hace que el bucle while se inicie de nuevo, omitiendo cualquier instrucción después de continue menos dentro del bucle. break y continue se activan frecuentemente mediante una prueba if .
La sintaxis de break...continue es:
while boolean expression
begin
statement
[ statement ]...
break
[ statement ]...
continue
[ statement ]...
end
A continuación se muestra un ejemplo con while , break , continue e if que invierte el aumento producido en los ejemplos anteriores. Siempre que el precio promedio permanezca por encima de $20, todos los precios se reducen a la mitad. Después se selecciona el precio máximo. Si es inferior a $40, se sale del bucle while ; en caso contrario, intenta realizar el bucle de nuevo. continue permite que la instrucción print se ejecute sólo cuando el promedio está por encima de $20. Después de que termina el bucle while , se imprime un mensaje y una lista de los libros con el precio máximo.
while (select avg(price) from titles) > $20
begin
update titles
set price = price / 2
if (select max(price) from titles) < $40
break
else
if (select avg(price) from titles) < $20
continue
print "Average price still over $20"
end
select title_id, price from titles
where price > $20
print "Not Too Expensive"
Si hay dos o más bucles while anidados, la instrucción break sale al siguiente bucle exterior. Primero se ejecutan todas las instrucciones que aparecen después de la palabra clave end del bucle interno y luego se reinicia el bucle externo .
declare y variables locales
Una variable es una entidad a la que se asigna un valor. Este valor puede cambiar durante el lote o el procedimiento almacenado donde se utiliza la variable. SQL Server tiene dos tipos de variables: locales y globales. Las variables locales están definidas por el usuario, mientras que las variables globales las suministra el sistema y están predefinidas.
Las variables locales se declaran, nombran y escriben mediante la palabra clave declare , y reciben un valor inicial mediante una instrucción select . Dichas variables deben declararse, recibir un valor y utilizarse en su totalidad dentro del mismo lote o procedimiento.
Las variables locales se utilizan frecuentemente en un lote o procedimiento almacenado como contadores de bucles while o bloques if...else . Cuando se usan en procedimientos almacenados, las variables locales se declaran para su uso automático no interactivo por parte del procedimiento cuando éste se ejecuta.
Los nombres de las variables locales deben empezar con el símbolo "@" y después seguir las reglas para identificadores. A cada variable local se le debe asignar un tipo de datos definido por el usuario o un tipo de datos suministrado por el sistema distinto de text , image o sysname .
Las variables locales se declaran con esta sintaxis:
declare @ variable_name datatype
[, @ variable_name datatype ]...
Variables y valores nulos
A las variables locales se les asigna el valor NULL cuando se declaran, y se les puede asignar el valor nulo mediante una instrucción select . El significado especial de NULL requiere que la comparación entre variables con valores nulos y otros valores nulos se ajuste a reglas especiales.
Esta tabla muestra los resultados de comparaciones entre columnas con valores nulos y expresiones con valores nulos usando operadores de comparación diferentes (una expresión puede ser una variable, un literal, o una combinación de variables, literales y operadores aritméticos).
Comparación de valores nulos | ||
Usando los operadores =, != o <> | Usando los operadores <, >, <=, !< o !> | |
Comparando c olumn_value y c olumn_value | FALSE | FALSE |
Comparando c olumn_value y e xpression | TRUE | FALSE |
Comparando e xpression y c olumn_value | TRUE | FALSE |
Comparando e xpression y e xpression | TRUE | FALSE |
declare y variables locales
Las variables globales son variables predefinidas suministradas por el sistema. Se distinguen de las variables locales por tener dos símbolos "@" precediendo a sus nombres, por ejemplo, @@ error .
Estas son las variables globales:
Variables globales de SQL Server | |
Variable | Contenido |
@@char_convert | Contiene 0 si la conversión del juego de caracteres no está en efecto. Contiene 1 si la conversión del juego de caracteres está en efecto. |
@@client_csname | Contiene el nombre del juego de caracteres del cliente. Se define como NULL si el juego de caracteres del cliente nunca fue inicializado; en caso contrario, contiene el nombre del último juego de caracteres utilizado. |
@@client_csid | Contiene la ID del juego de caracteres del cliente. Se define como -1 si el juego de caracteres del cliente nunca fue inicializado; en caso contrario, contiene la id de syscharsets del último juego de caracteres usado. |
@@connections | Contiene el número de logins o intentos de login. |
@@cpu_busy | Contiene la cantidad de tiempo, en pulsos, que la CPU empleó en realizar el trabajo de SQL Server desde la última vez que se inició. |
@@error | Contiene 0 si la última transacción se ejecutó de forma correcta; en caso contrario, contiene el último número de error generado por el sistema. La variable global @@error se utiliza generalmente para verificar el estado de error, se haya ejecutado correctamente o no, de la última instrucción emitida. Una instrucción como if @@error != 0 seguida de return origina una salida por error. |
@@identity | Contiene el último valor insertado en una columna IDENTITY mediante una instrucción insert o select into . @@identity se define cada vez que se inserta una fila en una tabla. Si una instrucción inserta múltiples filas, @@ identity refleja el valor IDENTITY de la última fila insertada. Si la tabla afectada no contiene una columna IDENTITY, @@identity se define en 0. El valor de @@identity no se ve afectado por el fallo de una instrucción insert o select into , ni por la reversión de la transacción que la contenía. @@ identity conserva el último valor insertado en una columna IDENTITY, aunque la instrucción que la haya insertado no se consigne. |
@@idle | Contiene la cantidad de tiempo, en pulsos, que SQL Server estuvo inactivo. |
@@io_busy | Contiene la cantidad de tiempo, en pulsos, que SQL Server empleó para efectuar operaciones de entrada y salida. |
@@isolation | Contiene el nivel de aislamiento actual del programa Transact-SQL. @@isolation toma el valor del nivel activo (1 o 3). |
@@langid | Define la ID de idioma local del idioma en uso, según el valor de syslanguages.langid . |
@@language | Define el nombre del idioma en uso, según el valor de syslanguages.name . |
@@maxcharlen | Contiene la longitud máxima, en bytes, de los caracteres multibyte del juego de caracteres predeterminado. |
@@max_connections | Contiene el número máximo de conexiones simultáneas que se pueden realizar con SQL Server en este entorno informático. El usuario puede configurar SQL Server para cualquier número de conexiones menor o igual que el valor de @@max_connections con sp_configure " number of user connections ". |
@@ncharsize | Contiene la longitud media, en bytes, de un carácter nacional. |
@@nestlevel | Contiene el nivel de anidación de la ejecución actual, inicialmente cero. Cada vez que un procedimiento almacenado o disparador llama a otro procedimiento almacenado o disparador, se incrementa el nivel de anidación. Si se supera el máximo de 16, la transacción se aborta. |
@@pack_received | Contiene el número de paquetes de entrada leídos por SQL Server. |
@@pack_sent | Contiene el número de paquetes de salida escritos por SQL Server. |
@@packet_errors | Contiene el número de errores generados mientras SQL Server enviaba y recibía paquetes. |
@@procid | Contiene la ID de procedimiento almacenado del procedimiento en ejecución. |
@@rowcount | Contiene el número de filas afectadas por la última consulta. @@rowcount es definida como cero por cualquier comando que no devuelve filas, como una instrucción if . |
@@servername | Contiene el nombre de este SQL Server. |
@@spid | Contiene el número de la ID de proceso de servidor del proceso actual. |
@@sqlstatus | Contiene información de estado resultante de la última instrucción fetch . |
@@textcolid | Contiene la ID de columna de la columna referenciada por @@ textptr . El tipo de datos de esta variable es tinyint . |
@@textdbid | Contiene la ID de base de datos de una base de datos que contiene un objeto con la columna referenciada por @@ textptr . El tipo de datos de esta variable es smallint. |
@@textobjid | Contiene la ID de objeto de un objeto que contiene la columna referenciada por @@ textptr . El tipo de datos de esta variable es int |
@@textptr | Contiene el puntero de texto de la última columna text o image insertada o actualizada por un proceso. El tipo de datos de esta variable es binary(16) (no confunda esta variable con la función textptr ). |
@@textsize | Contiene el límite del número de bytes de datos text o image devueltos por una instrucción select . El límite predeterminado es 32K bytes para isql ; el valor predeterminado depende del software del cliente. Puede cambiarse el límite de una sesión mediante set textsize . |
@@textts | Contiene la marca horaria de texto de la columna referenciada por @@ textptr . El tipo de datos de esta variable es varbinary(8) . |
@@thresh_hysteresis | Contiene la disminución de espacio libre necesaria para activar un umbral. Esta cantidad, también conocida como valor de histéresis, se mide en páginas de base de datos de 2K. Determina la proximidad a la que se pueden colocar los umbrales en un segmento de base de datos. |
@@timeticks | Contiene el número de microsegundos por pulso. La cantidad de tiempo por pulso es dependiente de la máquina. |
@@total_errors | Contiene el número de errores generados mientras SQL Server realizaba una lectura o escritura. |
@@total_read | Contiene el número de lecturas de disco realizadas por SQL Server desde la última vez que se inició. |
@@total_write | Contiene el número de escrituras de disco realizadas por SQL Server desde la última vez que se inició. |
@@tranchained | Contiene el modo de transacción actual del programa Transact-SQL. @@tranchained devuelve 0 para no encadenadas o 1 para encadenadas. |
@@trancount | Contiene el número de transacciones activas del usuario actual. |
@@transtate | Contiene el estado actual de una transacción después que se ejecuta una instrucción. Sin embargo, @@transtate no se borra para cada instrucción, al contrario de lo que ocurre con @@error . |
@@version | Contiene la fecha de la versión actual de SQL Server. |
goto
La palabra clave goto origina una bifurcación incondicional a un rótulo definido por el usuario. goto y los rótulos pueden utilizarse en procedimientos almacenados y lotes. El nombre del rótulo debe ajustarse a las reglas para identificadores e ir seguido de un signo de dos puntos (:) la primera vez que se introduce. No va seguido de un signo de dos puntos cuando se utiliza con goto .
A continuación se muestra la sintaxis:
label :
goto label
A continuación se muestra un ejemplo que utiliza goto y un rótulo, un bucle while u una variable local como contador:
declare @count smallint
select @count = 1
restart:
print "yes"
select @count = @count + 1
while @count <=4
goto restart
Como en este ejemplo, goto generalmente se hace dependiente de un bucle while o una prueba if , o alguna otra condición, a fin de evitar un bucle infinito entre goto y el rótulo.
return
La palabra clave return sale de un lote o procedimiento de forma incondicional y puede usarse en cualquier momento de un lote o procedimiento. Cuando se utiliza en procedimientos almacenados, return puede aceptar un argumento opcional para devolver un estado al solicitante. Las instrucciones que aparecen después de return no se ejecutan.
La sintaxis es simplemente:
return [ int_expression ]
A continuación se muestra un ejemplo de un procedimiento almacenado que utiliza return , así como if...else y begin...end :
create procedure findrules @nm varchar(30) = null as
if @nm is null
begin
print "You must give a user name"
return
end
else
begin
select sysobjects.name, sysobjects.id, sysobjects.uid
from sysobjects, master..syslogins
where master..syslogins.name = @nm
and sysobjects.uid = master..syslogins.suid
and sysobjects.type = "R"
end
Si no se proporciona ningún nombre de usuario como parámetro cuando se llama a findrules , la palabra clave return hace que el procedimiento se detenga después de que el usuario haya recibido un mensaje en su pantalla. Si se proporciona un nombre de usuario, los nombres de las reglas propiedad del usuario se recuperan de las tablas del sistema correspondientes.
return es similar a la palabra clave break usada dentro de los bucles while
La palabra clave print , utilizada en el ejemplo anterior, muestra un mensaje definido por el usuario o el contenido de una variable local en la pantalla del usuario. La variable local debe declararse dentro del mismo lote o procedimiento en el que se utiliza. El mensaje en sí puede tener hasta 255 bytes de longitud.
La sintaxis es:
print { format_string | @ local_variable |
@@ global _ variable } [, arg_list ]
He aquí otro ejemplo:
if exists (select postalcode from authors
where postalcode = '94705')
print "Berkeley author"
A continuación se indica cómo utilizar print para mostrar el contenido de una variable local:
declare @msg char(50)
select @msg = "What's up doc?"
print @msg
raiserror
raiserror muestra un error definido por el usuario o un mensaje de variable local en la pantalla del usuario y define un indicador del sistema para registrar el hecho de que se ha producido un error. Al igual que ocurre con print , la variable local debe declararse en el mismo lote o procedimiento en que se utiliza. El mensaje puede tener hasta 255 caracteres de longitud.
A continuación se muestra la sintaxis de raiserror :
raiserror error_number
[{ format_string | @ local_variable }] [, arg_list ]
[ extended_value = extended_value [{, extended_value = extended_value }...]]
waitfor
La palabra clave waitfor especifica una hora determinada del día, un intervalo de tiempo o un evento en el que debe tener lugar la ejecución de un bloque de instrucciones, un procedimiento almacenado o una transacción.
A continuación se muestra la sintaxis:
waitfor {delay " time " | time " time " | errorexit | processexit | mirrorexit}
La palabra clave delay indica a SQL Server que espere hasta que haya transcurrido el tiempo especificado. time indica a SQL Server que espere hasta la hora especificada, proporcionada en uno de los formatos aceptables para datos datetime .
No hay comentarios:
Publicar un comentario