jueves, 10 de noviembre de 2011

USO DE LOTES Y LANGUAJE DE CONTROL DE FLUJO

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
 

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 .