Sunteți pe pagina 1din 17

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. Tambin se pueden utilizar las
estructuras de control de flujo ofrecidas por Transact-SQL para conectar las instrucciones
utilizando estructuras de tipo de programacin.
En este captulo se trata lo siguiente:
Una introduccin 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
Definicin de lote y de lenguaje de control de flujo
Hasta aqu, cada ejemplo de la Gua del Usuario de Transact-SQL consisti de una instruccin
individual. Las instrucciones individuales se ejecutan en SQL Server de una en una, introduciendo
instrucciones y recibiendo resultados de forma interactiva. SQL Server tambin puede procesar
instrucciones mltiples ejecutadas como un lote, tanto de forma interactiva como desde un archivo.
Un lote de instrucciones SQL se termina mediante una seal de fin de lote que indica a SQL Server
que contine y ejecute las instrucciones. La seal de fin de lote para la utilidad SQL autnoma isql
es la palabra "go" sola en una lnea. Para obtener ms detalles, consulte el manual de programas
de utilidad de SQL Server.
Desde el punto de vista tcnico, una sola instruccin SQL puede constituir un lote, pero
normalmente se piensa en un lote como un conjunto de instrucciones mltiples. 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 ejecucin 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 ejecucin condicional de comandos y while
para la ejecucin repetitiva, permite refinar y controlar el funcionamiento de las instrucciones SQL.
El lenguaje de control de flujo de Transact-SQL transforma el SQL estndar en un lenguaje de
programacin 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 operacin drop con un objeto y despus hacer referencia a ste
o volver a crearlo en el mismo lote.

Cualquier opcin definida con una instruccin 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
aplicarn a las consultas de dicho lote.

Ejemplos del uso de lotes


Los ejemplos de esta seccin describen lotes que utilizan el formato de la utilidad isql , que tiene
una clara seal de fin de lote: la palabra "go" sola en una lnea. A continuacin 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 despus 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 instruccin create view debe ser la nica instruccin de un lote. Este lote contiene una sola
instruccin, que crea una vista:
create view testview as
select column1 from test
go
Se puede combinar una instruccin use con otras instrucciones siempre que los objetos a los que
haga referencia en las instrucciones subsiguientes estn en la base de datos donde empez. Este
lote selecciona de una tabla de la base de datos master y despus abre la base de datos pubs 2 .
El lote supone que se encuentra en la base de datos master del principio. Tras la ejecucin del lote,
pubs2 es la base de datos actual.
select count(*) from sysdatabases
use pubs2
go

------------9

(1 row affected)
Se puede combinar una instruccin 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 instruccin
drop con otraselect :
drop table test
select count(*) from titles
go
-----------18
(1 row affected)
Si hay un error de sintaxis en algn punto del lote, no se ejecutar ninguna de las instrucciones.
Por ejemplo, a continuacin se muestra un lote con un error de escritura en la ltima instruccin, 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 tambin generan mensajes de error. A continuacin 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 slo contener 1 sentencia.
El siguiente lote funcionar si todava est en la base de datos especificada en la instruccin 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 ms lotes de instrucciones SQL a isql desde un archivo del sistema
operativo. Un archivo puede incluir ms de un lote, es decir, ms de una serie de instrucciones,
cada uno terminado con la palabra "go".
Por ejemplo, un archivo del sistema operativo podra 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 seccin sobre la utilidad isql del manual de programas de utilidad de SQL Server para
obtener informacin especfica del entorno sobre la ejecucin de lotes almacenados en archivos.
Lotes enviados como archivos
Un lote es un grupo de una o ms instrucciones Transact-SQL enviadas al mismo tiempo desde
una aplicacin a SQL Server para su ejecucin. SQL Server compila las declaraciones de un lote
en una sola unidad ejecutable, llamado un plan de ejecucin. Las afirmaciones contenidas en el
plan de ejecucin se ejecutan de una en una.
Cada instruccin de Transact-SQL se deben terminar con un punto y coma. Este requisito no se
cumple, pero la capacidad para poner fin a una declaracin sin un punto y coma est en desuso y
pueden ser removidos en una versin futura de Microsoft SQL Server.
Un error de compilacin, como un error de sintaxis, impide la elaboracin del plan de ejecucin. Por
lo tanto, no las instrucciones del lote se ejecutan.
Un error en tiempo de ejecucin, como un desbordamiento aritmtico o una violacin de restriccin,
tiene uno de los siguientes efectos:
La mayora de errores de ejecucin detener el estado de cuenta actual y los estados que le siguen en
el lote.
Algunos de los errores en tiempo de ejecucin, tales como violacines restriccin, slo se detiene la
instruccin actual. Todas las sentencias restantes en el lote se ejecutan.
Las declaraciones que se ejecutan antes de la declaracin que encontr el error en tiempo de
ejecucin no se vern afectados. La nica excepcin es cuando el lote se encuentra en una
transaccin y el error hace que la transaccin se deshace. En este caso, cualquier modificacin de
los datos no confirmados que se hacen antes de que el error en tiempo de ejecucin 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 declaracin
luego no durante la ejecucin, los resultados de la primera declaracin 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 definicin de la sentencia CREATE primero.
Una tabla no puede ser cambiado y despus se hace referencia las nuevas columnas en el mismo
lote.
Si una instruccin EXECUTE es la primera instruccin de un lote, la palabra clave EXECUTE no es
necesario. La palabra clave EXECUTE es necesario si la instruccin EXECUTE no es la primera
declaracin en el lote.

Lotes enviados como archivos


Se pueden enviar uno o ms lotes de instrucciones SQL a isql desde un archivo del sistema
operativo. Un archivo puede incluir ms de un lote, es decir, ms de una serie de instrucciones,
cada uno terminado con la palabra "go".
Por ejemplo, un archivo del sistema operativo podra 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)

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

Funcin

if

Define una ejecucin condicional.

...else

Define una ejecucin alternativa cuando la condicin if es falsa.

begin

Comienzo de un bloque de instrucciones.

...end

Final de un bloque de instrucciones.

while

Repite la ejecucin de instrucciones mientras la condicin es verdadera.

break

Sale del final del siguiente bucle while ms exterior.

...continue

Reinicio del bucle while .

declare

Declara variables locales.

goto label

Va a un rtulo ( label:) , una posicin en un bloque de instrucciones.

return

Sale de forma incondicional.

waitfor

Define el retardo para la ejecucin 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 instruccin SQL.
*/

if ... else
La palabra clave if , con o sin la compaa de else , se utiliza para introducir una condicin que
determina si se ejecutar la instruccin siguiente. La instruccin SQL se ejecuta si la condicin se
cumple, es decir, si devuelve TRUE (verdadero).
La palabra clave else introduce una instruccin SQL alternativa que se ejecuta cuando la condicin
if devuelve FALSE (falso).
La sintaxis para if y else es:
if
boolean_expression
statement
[else

[if boolean_expression ]
statement ]
Una expresin booleana es una expresin que devuelve TRUE o FALSE. En ella se puede incluir
un nombre de columna, una constante, cualquier combinacin de nombres de columna y
constantes conectados por operadores aritmticos o basados en bits, o una subconsulta, siempre
que sta devuelva un solo valor. Si la expresin booleana contiene una instruccin select , debe
incluirse entre parntesis y devolver un solo valor.
A continuacin 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
construccin if o despus de una else . La expresin de la prueba if slo puede devolver un valor.
Adems, para cada estructura if...else , puede existir una instruccin select para if y otra para else
. Para incluir ms de una instruccin select , hay que utilizar las palabras clave begin...end . El
nmero mximo de pruebas if que pueden anidarse vara 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 condicin if slo se aplicara a la primera instruccin SQL. La segunda
instruccin se ejecutara 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 condicin para la ejecucin repetida de una instruccin o un bloque
de instrucciones. Las instrucciones se ejecutan reiteradamente siempre que la condicin
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 despus 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 instruccin despus 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 continuacin 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. Despus se selecciona el precio mximo. Si es
inferior a $40, se sale del bucle while ; en caso contrario, intenta realizar el bucle de nuevo.
continue permite que la instruccin print se ejecute slo cuando el promedio est por encima de
$20. Despus de que termina el bucle while , se imprime un mensaje y una lista de los libros con el
precio mximo.
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 ms bucles while anidados, la instruccin break sale al siguiente bucle exterior.
Primero se ejecutan todas las instrucciones que aparecen despus 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 estn definidas por el usuario, mientras que las
variables globales las suministra el sistema y estn predefinidas.
Las variables locales se declaran, nombran y escriben mediante la palabra clave declare , y
reciben un valor inicial mediante una instruccin 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 automtico no interactivo por parte del procedimiento
cuando ste se ejecuta.
Los nombres de las variables locales deben empezar con el smbolo "@" y despus 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 instruccin select . El significado especial de NULL requiere que la
comparacin 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 comparacin diferentes (una expresin
puede ser una variable, un literal, o una combinacin de variables, literales y operadores
aritmticos).

Comparacin 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 smbolos "@" precediendo a sus nombres, por ejemplo, @@
error .
Estas son las variables globales:

Variable
@@char_convert
@@client_csname

@@client_csid

@@connections
@@cpu_busy
@@error

@@identity

@@idle
@@io_busy
@@isolation
@@langid
@@language
@@maxcharlen
@@max_connection
s

@@ncharsize
@@nestlevel

Variables globales de SQL Server


Contenido
Contiene 0 si la conversin del juego de caracteres no est en efecto.
Contiene 1 si la conversin 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, contiene la id de syscharsets del ltimo juego de caracteres
usado.
Contiene el nmero 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 transaccin se ejecut de forma correcta; en
caso contrario, contiene el ltimo nmero 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 instruccin emitida. Una instruccin como if @@error != 0
seguida de return origina una salida por error.
Contiene el ltimo valor insertado en una columna IDENTITY mediante
una instruccin insert o select into . @@identity se define cada vez
que se inserta una fila en una tabla. Si una instruccin inserta mltiples
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 instruccin
insert o select into , ni por la reversin de la transaccin que la
contena. @@ identity conserva el ltimo valor insertado en una
columna IDENTITY, aunque la instruccin 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, segn el valor de
syslanguages.langid .
Define el nombre del idioma en uso, segn el valor de
syslanguages.name .
Contiene la longitud mxima, en bytes, de los caracteres multibyte del
juego de caracteres predeterminado.
Contiene el nmero mximo de conexiones simultneas que se pueden
realizar con SQL Server en este entorno informtico. El usuario puede
configurar SQL Server para cualquier nmero 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 carcter nacional.
Contiene el nivel de anidacin de la ejecucin actual, inicialmente cero.
Cada vez que un procedimiento almacenado o disparador llama a otro
procedimiento almacenado o disparador, se incrementa el nivel de
anidacin. Si se supera el mximo de 16, la transaccin se aborta.

@@pack_received
@@pack_sent
@@packet_errors
@@procid
@@rowcount
@@servername
@@spid
@@sqlstatus
@@textcolid
@@textdbid
@@textobjid
@@textptr

@@textsize

@@textts
@@thresh_hysteresi
s
@@timeticks
@@total_errors
@@total_read
@@total_write
@@tranchained
@@trancount
@@transtate
@@version

Contiene el nmero de paquetes de entrada ledos por SQL Server.


Contiene el nmero de paquetes de salida escritos por SQL Server.
Contiene el nmero de errores generados mientras SQL Server
enviaba y reciba paquetes.
Contiene la ID de procedimiento almacenado del procedimiento en
ejecucin.
Contiene el nmero de filas afectadas por la ltima consulta.
@@rowcount es definida como cero por cualquier comando que no
devuelve filas, como una instruccin if .
Contiene el nombre de este SQL Server.
Contiene el nmero de la ID de proceso de servidor del proceso actual.
Contiene informacin de estado resultante de la ltima instruccin
fetch .
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 funcin textptr
).
Contiene el lmite del nmero de bytes de datos text o image devueltos
por una instruccin select . El lmite predeterminado es 32K bytes para
isql ; el valor predeterminado depende del software del cliente. Puede
cambiarse el lmite de una sesin 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 disminucin de espacio libre necesaria para activar un
umbral. Esta cantidad, tambin conocida como valor de histresis, se
mide en pginas 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 nmero de microsegundos por pulso. La cantidad de
tiempo por pulso es dependiente de la mquina.
Contiene el nmero de errores generados mientras SQL Server
realizaba una lectura o escritura.
Contiene el nmero de lecturas de disco realizadas por SQL Server
desde la ltima vez que se inici.
Contiene el nmero de escrituras de disco realizadas por SQL Server
desde la ltima vez que se inici.
Contiene el modo de transaccin actual del programa Transact-SQL.
@@tranchained devuelve 0 para no encadenadas o 1 para
encadenadas.
Contiene el nmero de transacciones activas del usuario actual.
Contiene el estado actual de una transaccin despus que se ejecuta
una instruccin. Sin embargo, @@transtate no se borra para cada
instruccin, al contrario de lo que ocurre con @@error .
Contiene la fecha de la versin actual de SQL Server.

goto
La palabra clave goto origina una bifurcacin incondicional a un rtulo definido por el usuario. goto
y los rtulos pueden utilizarse en procedimientos almacenados y lotes. El nombre del rtulo 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 continuacin se muestra la sintaxis:
label :
goto label
A continuacin se muestra un ejemplo que utiliza goto y un rtulo, 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 condicin, a fin de evitar un bucle infinito entre goto y el rtulo.
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 despus de return no se ejecutan.
La sintaxis es simplemente:
return [ int_expression ]
A continuacin 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 ningn nombre de usuario como parmetro cuando se llama a findrules , la
palabra clave return hace que el procedimiento se detenga despus 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 continuacin se indica cmo 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 continuacin 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 da, un intervalo de tiempo o un
evento en el que debe tener lugar la ejecucin de un bloque de instrucciones, un procedimiento
almacenado o una transaccin.
A continuacin 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 .

S-ar putea să vă placă și