Sunteți pe pagina 1din 14

TrucosdeSqlServerCrearunStoredProcedure

ParacrearunStoredpodemosutilizarelEnterpriseManageroelQueryAnalizer.

SilohacemosporelEnterpriseManager,encimadelabasededatos,desplegaremoslacarpeta
destoreds,botnderechoy"NewStoredProcedure"

ElEnterpriseManagerpordefectopone:
CREATEPROCEDURE[OWNER].[PROCEDURENAME]AS

EnProcedureNamecolocamoselnombredelStoredquedeseamos,yacontinuacindelASlas
consultasquequeramos:

CREATEPROCEDUREDIC_FORO

AS
SETNOCOUNTON

SELECT
Campos
FROM
Tabla
With(NoLock)

SETNOCOUNTOFF
GO

LosStoredsadmitenparmetros.Sirvenparapoderrealizarquerysmsprecisas.

Porejemplo:

CREATEPROCEDUREDIC_FORO
(
@IdUsuarioint=0
)
AS
SETNOCOUNTON

SELECT
*
FROM
Usuario
With(NoLock)
WHERE
Usuario=@IdUsuario

SETNOCOUNTOFF
GO

Tambinpodemosutilizarparmetrosdesalida,pararetornardatos.Paraellodeclararemosel
parmetrocomoOutput.

A.Utilizar BREAK y CONTINUE con IFELSE y WHILE


anidados
En el ejemplo siguiente, si el precio de venta promedio de un producto es inferior
a $300, el bucle WHILE dobla los precios y, a continuacin, selecciona el precio
mximo. Si el precio mximo es menor o igual que $500, el bucle WHILE se reinicia y
vuelve a doblar los precios. Este bucle contina doblando los precios hasta que el
precio mximo es mayor que $500, despus de lo cual sale del bucle WHILE e imprime
un mensaje.
Transact-SQL

USE AdventureWorks2012;
GO
WHILE (SELECT AVG(ListPrice) FROM Production.Product) < $300
BEGIN
UPDATE Production.Product
SET ListPrice = ListPrice * 2
SELECT MAX(ListPrice) FROM Production.Product
IF (SELECT MAX(ListPrice) FROM Production.Product) > $500
BREAK
ELSE
CONTINUE
END
PRINT 'Too much for the market to bear';

DECLARE@CONTADORINT
SET@CONTADOR=1
WHILE@CONTADOR<1000
BEGIN
INSERTINTOTABLEVALUES('XXX')
CONTINUE
END
CONSULTA:
IFNOTEXISTS(Selectnombrefrompersonawnerenombre=@nombre)
Begin
Insertintopersona(nombre)values(@nombre)
End

[SQL] Por qu utilizar Tablas


Temporales Locales, Globales o
Variables de Tabla?.
12062009

10 Votes

Saludos amigos en esta ocasin leyendo me encontr con un tema muy interesante acerca de las
tablas temporales en SQL, les dejo lo que traduje del tema con una explicacin y ejemplo de
como crear tablas temporales locales, globales y variables de tabla, dentro del Motor de Base de
Datos de SQL Server 2008.

Tablas Temporales.
Las tablas temporales son consideradas tablas regulares, y estas se almacenan
automticamente en la base de datos de tempdb.

Las tablas temporales se pueden usar en los siguientes escenarios:

Como alternativa a los cursores: por ejemplo, en lugar de utilizar un cursor de Transact-SQL
para recorrer un conjunto de resultados y realizar tareas basadas en cada fila, en su lugar puede
utilizar una tabla temporal. Usando un bucle WHILE, puede recorrer cada fila de la tabla y realizar
la accin de la fila especificada, posteriormente debe eliminar la fila de la tabla temporal.

Como almacenamiento incremental de conjuntos de resultados: Por ejemplo, imaginemos


que tiene una sola consulta SELECT que realiza una combinacin JOINcon diez tablas. A veces
las consultas con varias combinaciones JOINS pueden funcionar de manera incorrecta. Una
tcnica para intentar es la de fraccionar o fragmentar una consulta grande en consultas ms
pequeas. Si usamos tablas temporales, podemos crear conjuntos de resultados intermedios
basados en consultas de menor tamao, en lugar de intentar ejecutar una consulta nica que
sea demasiado grande y de combinaciones mltiples multi-joined.

Como temporal en la sobrecarga baja de bsqueda de tabla: Por ejemplo, imagine que
usted est utilizando una consulta que tarda varios segundos en ejecutarse, pero slo muestra
un pequeo conjunto de resultados, el cual desea utilizar en varias reas de su procedimiento
almacenado, pero cada vez que se llama se incurre en el tiempo de ejecucin de la consulta
general. Para resolver esto, puede ejecutar la consulta una sola vez en el procedimiento,
llenando una tabla temporal, de esta manera se puede hacer referencia a la tabla temporal en
varios lugares en su cdigo, sin incurrir en una sobrecarga de resultados adicional.

Existen dos tipos de tablas temporales: Globales y Locales.

Las tablas temporales Locales se escriben anteponiendo el smbolo # y tablas


temporales Globales con el doble smbolo ##.

Tablas temporales Locales.


Las tablas temporales Locales estn disponibles para usarse por cada conexin actual del
usuario que los cree.

Varias conexiones pueden crear una tabla temporal con mismo nombre, esto solo para para
tablas temporales Locales sin causar conflictos. La representacin interna de la tabla local tiene
un nombre nico, para no estar en conflicto con otras tablas temporales con el mismo nombre
creado por otras conexiones en la tempdb.

Las tablas temporales locales son eliminadas con el comando DROP o se eliminan
automticamente de memoria cuando se cierra la conexin del usuario.

Creando la tabla temporal Local:

CREATETABLE#ProductosResumen

(idProductointNOTNULLPRIMARYKEY,

nombrevarchar(75)NULL,

preciosmallmoneyNULL

);

Insertando datos en la tabla temporal global.

INSERT#ProductosResumen(idProducto,nombre,precio)

SELECTid,nombre,precioFROMdbo.DEMO_PRODUCTO

ORDERBYnombre;

Seleccionando los datos de la tabla temporal.

Seleccionandolosdatosdelatablatemporal

SELECT*FROM#ProductosResumen;

Resumendepreciosdelatablatemporal

SELECTAVG(precio)FROM#ProductosResumen;
Resultado.

Eliminando la tabla.

Eliminandolatablatemporal

DROPTABLE#ProductosResumen;

Nota: Para que el ejemplo funcione deben de ejecutar en un solo bloque de


instrucciones todo el cdigo que coloque anteriormente. Para este caso yo llene mi
tabla temporal con datos de una tabla que ya tenia creada en la base de datos,
ustedes pueden utilizar un insert normal.

Tablas Temporales Globales.


Las tablas temporales Globales tienen un alcance diferente al de las tablas temporalesLocales.
Una vez que una conexin crea una tabla temporal Global, cualquier usuario con permisos
adecuados sobre la base de datos puede acceder a la tabla. A diferencia de tablas
temporales Locales, no se pueden crear versiones simultneas de una tabla temporal
Global, ya que esto generar un conflicto de nombres.

Las tablas temporales Globales de eliminan explcitamente de SQL Server ejecutandoDROP


TABLE. Tambin se eliminan automticamente despus de que se cierra la conexin que la
creo, la tabla temporal Global no es referenciada por otras conexiones, pero es muy raro
ver que se utilicen tablas temporales Globales en bases de datos en produccin.

Es importante considerar cuando una tabla va o debe ser compartida a travs de


conexiones, se debe crear una tabla real, en lugar de una tabla temporal Global. No
obstante, SQL Server ofrece esto como una opcin.

Creando la tabla temporal Global:

CreandolatablatemporalGlobal

CREATETABLE##Roles

(idRolintNOTNULLPRIMARYKEY,

nombrevarchar(30)NULL,

activobitNULL

);
Insertando y seleccionando datos de la tabla temporal global:

Insertandodatosenlatablatemporalglobal

INSERTINTO##Roles

VALUES(1,'Administrador',1),

(2,'Supervisor',1),

(3,'Programador',0)

Seleccionandolosdatosdelatablatemporalglobal

SELECT*FROM##Roles;

Resultado:

Eliminando la tabla temporal global desde la conexin original que la creo.

Eliminandolatablatemporalglobal

DROPTABLE##Roles;

Variables de Tabla.
Por otro lado tenemos las Variables de Tabla que son un tipo de datos que puede ser utilizados
en un lote Transact-SQL (Batch), procedimiento almacenado o funcin; estas variables de
tabla son creado y definidas de forma similar a una tabla, slo con un alcance de vida
estrictamente definido. Las Variables de tabla suelen ser buenos reemplazos de tablas
temporales siempre y cuando el conjunto de datos es pequeo.

Razones para usar las variables de tabla:

Duracin o alcance. La duracin de la variable de tabla slo vive durante la ejecucin


del lote, funcin, o procedimiento almacenado.

Tiempos de bloqueo ms cortos. Por el estrecho alcance o tiempo de vida.

Menos re compilaciones cuando se usa en los procedimientos almacenados.

Como se menciono anteriormente, hay inconvenientes para utilizar las variables de tabla. El
rendimiento de las variable de tabla se ve afectado cuando el resultado es demasiado
grande o cuando los datos de la columna de cardinalidad son fundamentales para la
optimizacin del proceso de consulta.
La sintaxis para crear una variable de tabla es similar a la de crear una tabla normal, se utiliza la
palabra clave DECLARE y el nombre de tabla, anteponiendo el smbolo @:

DECLARE @TableName TABLE

(column_name <data_type> [ NULL | NOT NULL ] [ ,...n ] )

Creando una variable de tabla:

Creandolavariabledetipotabla.

DECLARE@EstatusUsuariosTABLE

(idEstatusintNOTNULLPRIMARYKEY,

nombrevarchar(30)NULL

Insertando y seleccionando datos de la variable tabla:

Insertandoenlavariabledetipotabla.

INSERTINTO@EstatusUsuariosVALUES(1,'Activo'),

(2,'Inactivo'),

(3,'Bloqueado')

Consultandodatosdelavariabledetipotabla.

SELECT*FROM@EstatusUsuarios;

Al terminar la ejecucin del batch o bloque de instrucciones se eliminara la variable tabla, o si


colocamos una instruccin GO automticamente se eliminara y no la podremos utilizar como los
muestro en el siguiente ejempl, recuerde que los ejemplo para claridad los coloque separados,
pero los debe de ejecutar completos como lo hago abajo para el caso de la variables de tabla:

Creandolavariabledetipotabla.

DECLARE@EstatusUsuariosTABLE

(idEstatusintNOTNULLPRIMARYKEY,

nombrevarchar(30)NULL

Insertandoenlavariabledetipotabla.
INSERTINTO@EstatusUsuariosVALUES(1,'Activo'),

(2,'Inactivo'),

(3,'Bloqueado')

Consultandodatosdelavariabledetipotabla.

SELECT*FROM@EstatusUsuarios;

Alejecutarseelgooelbloquedeinstrucciones

lavariabletablaseeliminaraauitomaticamente.

Go

SELECT*FROM@EstatusUsuarios;

Como podrn notar en el primer select nos regreso:

Y para el segundo select:

Esto es por que como lo


comente anteriormente el tiempo de vida de la variable tabla termina al ejecutarse el bloque de
instrucciones, en este caso termino con el GO.

Cuando encontremos problemas de rendimiento, debemos de asegurarnos de probar todas las


soluciones y alternativas, y no necesariamente asumir que una de las opciones (tablas
Temporales) son menos deseables que otras (variables de tabla).

Espero les sea de ayuda, se que esta un poco largo el Post, pero creo vale la pena leerlo.
Apyame votando
aqu: http://blogit.ms/TopBloggers.aspx en la categora SQL Server. Los pasos para votar estn
aqu te llevara 3 min: Clic Aqu.
Etiquetas de Technorati: Tablas temporales,temporary tables,Local Tables,Global Tables,Variables
de Tabla,SQL 2008

Utilizar Sentencias SQL


Esta pgina muestra un procedimiento almacenado muy sencillo que no tiene parmetros.
Aunque la mayora de los procedimientos almacenados hacen cosas ms complejas que este
ejemplo, sirve para ilustrar algunos puntos bsicos sobre ellos. Como paso prvio, la sintaxis
para definir un procedimiento almacenado es diferente de un controlador de base de datos a
otro. Por ejemplo, algunos utilizan begin . . . end u otras palabras clave para indicar el principio
y final de la definicin de procedimiento. En algunos controladores, la siguiente sentencia SQL
crea un procedimiento almacenado.
createprocedureSHOW_SUPPLIERS
as
selectSUPPLIERS.SUP_NAME,COFFEES.COF_NAME
fromSUPPLIERS,COFFEES
whereSUPPLIERS.SUP_ID=COFFEES.SUP_ID
orderbySUP_NAME
El siguiente cdigo pone la sentencia SQL dentro de un string y lo asigna a la
variablecreateProcedure, que utilizaremos ms adelante.
StringcreateProcedure="createprocedureSHOW_SUPPLIERS"+
"as"+
"select SUPPLIERS.SUP_NAME,
COFFEES.COF_NAME"+
"fromSUPPLIERS,COFFEES"+
"whereSUPPLIERS.SUP_ID=COFFEES.SUP_ID"
+
"orderbySUP_NAME";
El siguiente fragmento de cdigo utiliza el objeto Connection, con para crear un
objetoStatement, que es utilizado para enviar la sentencia SQL que crea el procedimiento
almacenado en la base de datos.
Statementstmt=con.createStatement();
stmt.executeUpdate(createProcedure);
El procedimiento SHOW_SUPPLIERS ser compilado y almacenado en la base de datos como un
objeto de la propia base y puede ser llamado, como se llamara a cualquier otro mtodo.
Llamar a un Procedimiento Almacenado desde JDBC

JDBC permite llamar a un procedimiento almacenado en la base de datos desde una aplicacin
escrita en Java. El primer paso es crear un objeto CallableStatement. Al igual que con los
objetos Statement y PreparedStatement, esto se hace con una conexin
abierta,Connection. Un objeto CallableStatement contiene una llamada a un procedimiento
almacenado; no contiene el propio procedimiento. La primera lnea del cdigo siguiente crea una
llamada al procedimiento almacenado SHOW_SUPPLIERS utilizando la conexin con. La parte
que est encerrada entre corchetes es la sintaxis de escape para los precedimientos
almacenados. Cuando un controlador encuentra "{call SHOW_SUPPLIERS}", traducir esta
sintaxis de escape al SQL nativo utilizado en la base de datos para llamar al procedimiento
almacenado llamado SHOW_SUPPLIERS.
CallableStatementcs=con.prepareCall("{callSHOW_SUPPLIERS}");
ResultSetrs=cs.executeQuery();
La hoja de resultados de rs ser similar a esto.
SUP_NAME COF_NAME

Acme,Inc. Colombian
Acme,Inc. Colombian_Decaf
SuperiorCoffee French_Roast
SuperiorCoffee French_Roast_Decaf
TheHighGround Espresso
Observa que el mtodo utilizado para ejecutar cs es executeQuery porque cs llama a un
procedimiento almacenado que contiene una peticin y esto produce una hoja de resultados. Si
el procedimiento hubiera contenido una sentencia de actualziacin o una sentencia DDL, se
hubiera utilizado el mtodo executeUpdate. Sin embargo, en algunos casos, cuando el
procedimiento almacenado contiene ms de una sentencia SQL producir ms de una hoja de
resultados, o cuando contiene ms de una cuenta de actualizacinm o alguna combinacin de
hojas de resultados y actualizaciones. en estos casos, donde existen mltiples resultados, se
debera utilizar el mtodo execute para ejecutar CallableStatement.
La clase CallableStatement es una subclase de PreparedStatement, por eso un
objetoCallableStatement puede tomar parmetros de entrada como lo hara un
objetoPreparedStatement. Adems, un objeto CallableStatement puede tomar parmetros
de salida, o parmetros que son tanto de entrada como de salida. Los parmetros INOUT y el
mtodo execute se utilizan raramente.
Ejecutar procedimiento almacenado desde Java
(JDBC)
En Java invocar a un procedimiento almacenado que no devuelve valores es
bastante sencillo hacerlo desde JDBC, funciona de la misma manera que
con cualquier base de datos, solo es cuestin de cambiar la cadena de
conexin y el driver, el resto va igual.
En el ejemplo veremos con MySQL, pero como vengo diciendo cambien los
2 factores y podrn usarlo con cualquier otro motor de base de datos.
1 packageconexionDB;
2
3 importjava.sql.Connection;
4
5 publicclassConexionMySQL{
6
7 publicstaticConnectioncon_mysql;
8
9 publicstaticConnectionconectar(StringpHost,StringpUser,StringpPassword,String
10 Exception{
11 try{
12 StringdatabaseURL="jdbc:mysql://"+pHost+"/"+pDataBase;
13 Class.forName("com.mysql.jdbc.Driver");
14 con_mysql=java.sql.DriverManager.getConnection(databaseURL,pUser,
15 //System.out.println("ConexionconMySQLEstablecida..");
16 }catch(Exceptione){
17 e.printStackTrace();
18 thrownewException(e);
19 }
20 returncon_mysql;
21 }
}

En la siguiente clase veremos como implementar la clase anterior para


hacer la conexion, adems de invocar el procedimiento almacenado.
1 //importsnecesarios
2 importconexionDB.ConexionMySQL;
3 importjava.sql.CallableStatement;
4 .
5 .
6 ConnectionconnMY=null;
7 try{
8 //creamoslaconexion
9 connMY=ConexionMySQL.conectar("192.168.1.100","sa","*******","devtroce");
10 //establecemosquenoseaautocommit,
11 //asicontrolamoslatransacciondemaneramanual
12 connMY.setAutoCommit(false);
13 /*instanciamoselobjetocallablestatement
14 *queusaremosparainvocarelSP
15 *Lacantidadde"?"determinalacantidad
16 *parametrosquerecibeelprocedimiento
17 */
18 CallableStatementprcProcedimientoAlmacenado=connMY.prepareCall("{call
19 NuestroProcedimientoAlmacenado(?,?,?)}");
20 //cargarparametrosalSP
21 prcProcedimientoAlmacenado.setInt("pParametro1",1);
22 prcProcedimientoAlmacenado.setString("pParametro2","Devtroce.com");
23 prcProcedimientoAlmacenado.setInt("pParametro3",49);
24 //ejecutarelSP
25 prcProcedimientoAlmacenado.execute();
26 //confirmarsiseejecutosinerrores
27 connMY.commit();
28 }catch(Exceptione){
29 //deshacerlaejecucionencasodeerror
30 connMY.rollback();
31 //informarporconsola
32 e.printStackTrace();
33 }finally{
34 //cerrarlaconexion
35 connMY.close();
}

A pedido de Moise, edito el post y agrego la estructura de la tabla y un


Stored Procedure que cumple para ejecutar con el cdigo aqu:
1 CREATETABLEdevtroce(
2 idintNOTNULL,
3 campo2varchar(50)NOTNULL,
4 campo3intNOTNULL
5 )ONPRIMARY
6
7 CREATEPROCEDURENuestroProcedimientoAlmacenado
8 @idint,
9 @campo2varchar(50),
10 @campo3int
11 AS
12 BEGIN
13 INSERTINTO
14 devtroce
15 VALUES(
16 @id,
17 @campo2,
18 @campo3);
19 END

Publicarlo en Twitter
1

Publicarlo en Delicious
Aadirlo a LinkedIn
Publicarlo en Facebook

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