Uso del lenguaje de control de flujo

Anuncio
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
--------hello
column2
--------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 <>
Comparando c olumn_value y c
FALSE
olumn_value
Comparando c olumn_value y e
TRUE
xpression
Comparando e xpression y c
TRUE
olumn_value
Comparando e xpression y e
TRUE
xpression
Usando los operadores <, >,
<=, !< o !>
FALSE
FALSE
FALSE
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:
Variable
@@char_convert
@@client_csname
@@client_csid
Variables globales de SQL Server
Contenido
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.
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.
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,
@@connections
@@cpu_busy
@@error
@@identity
@@idle
@@io_busy
@@isolation
@@langid
@@language
@@maxcharlen
@@max_connections
@@ncharsize
@@nestlevel
@@pack_received
@@pack_sent
@@packet_errors
@@procid
@@rowcount
@@servername
@@spid
@@sqlstatus
contiene la id de syscharsets del último juego de caracteres usado.
Contiene el número de logins o intentos de login.
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ó.
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.
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.
Contiene la cantidad de tiempo, en pulsos, que SQL Server estuvo
inactivo.
Contiene la cantidad de tiempo, en pulsos, que SQL Server empleó para
efectuar operaciones de entrada y salida.
Contiene el nivel de aislamiento actual del programa Transact-SQL.
@@isolation toma el valor del nivel activo (1 o 3).
Define la ID de idioma local del idioma en uso, según el valor de
syslanguages.langid .
Define el nombre del idioma en uso, según el valor de
syslanguages.name .
Contiene la longitud máxima, en bytes, de los caracteres multibyte del
juego de caracteres predeterminado.
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 ".
Contiene la longitud media, en bytes, de un carácter nacional.
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.
Contiene el número de paquetes de entrada leídos por SQL Server.
Contiene el número de paquetes de salida escritos por SQL Server.
Contiene el número de errores generados mientras SQL Server enviaba
y recibía paquetes.
Contiene la ID de procedimiento almacenado del procedimiento en
ejecución.
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 .
Contiene el nombre de este SQL Server.
Contiene el número de la ID de proceso de servidor del proceso actual.
Contiene información de estado resultante de la última instrucción fetch .
@@textcolid
@@textdbid
@@textobjid
@@textptr
@@textsize
@@textts
@@thresh_hysteresis
@@timeticks
@@total_errors
@@total_read
@@total_write
@@tranchained
@@trancount
@@transtate
@@version
Contiene la ID de columna de la columna referenciada por @@ textptr .
El tipo de datos de esta variable es tinyint .
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.
Contiene la ID de objeto de un objeto que contiene la columna
referenciada por @@ textptr . El tipo de datos de esta variable es int
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 ).
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 .
Contiene la marca horaria de texto de la columna referenciada por @@
textptr . El tipo de datos de esta variable es varbinary(8) .
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.
Contiene el número de microsegundos por pulso. La cantidad de tiempo
por pulso es dependiente de la máquina.
Contiene el número de errores generados mientras SQL Server realizaba
una lectura o escritura.
Contiene el número de lecturas de disco realizadas por SQL Server
desde la última vez que se inició.
Contiene el número de escrituras de disco realizadas por SQL Server
desde la última vez que se inició.
Contiene el modo de transacción actual del programa Transact-SQL.
@@tranchained devuelve 0 para no encadenadas o 1 para
encadenadas.
Contiene el número de transacciones activas del usuario actual.
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 .
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
print
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 .
Descargar