SQL Server 2012

REGLAS DE NORMALICACIÓN.



Explicación del modelo Entidad-Relacion, modelo relacional y las reglas de normalización

SQL TRANSACT: Introducción a SQL Server 2008


Información sobre el proceso de instalación y configuración del SQL Server, sobre un Servidor de Windows 2003 Server, tenga en cuenta que sobre las versiones de Servidor de sistema operativo se debe instalar una versión Enterprice, mientras sobre Windows Xp o Windows 7 se debe instalar una versión Developer.

SQL TRANSACT: Comprobación de la Instalación de SQL, Introducción a la Instrucción Select

Conocer las herramientas que componen el Microsoft SQL Server 2008, los servicios que debe inicializarse, las bases de datos del sistema entre otros temas.

SQL TRANSACT: Uso de la instruccion SELECT



Uso de la instrucción SELECT como petición de datos, tambien usaremos la instrucción WHERE para filtrar los datos devueltos, usaremos la instruccion like y between.

--USO DE LA INSTRUCCION SELECT

USE NORTHWIND
GO

SELECT DISTINCT COUNTRY FROM CUSTOMERS --DISTINCT MUESTRA SOLO VALORES UNICOS

--CLAUSULA DE RESTRICCION WHERE

SELECT * FROM CUSTOMERS
WHERE COUNTRY='GERMANY'

SELECT * FROM ORDERS
WHERE --comparadores > < >= <= BETWEEN Ó LIKE
ORDERDATE BETWEEN '1998-01-01' AND '1998-31-12' AND EMPLOYEEID=7

SELECT * FROM CUSTOMERS
WHERE COMPANYNAME LIKE '_e%' -- el simbolo _ sustituye una letra, % varias letras

select * from customers
where companyname like '[AD]%' --todos los que comienzan con A ó con D


select * from customers
where companyname like '[A-D]%' --todos los que comienzan con A, B, C, D

select * from customers
where companyname like '[^A]%' --todos los que no comiencen con la letra A,  [^]no contiene


SELECT * FROM CUSTOMERS
WHERE COUNTRY  NOT IN ( 'BRAZIL','GERMANY','SPAIN')--LOS QUE ESTEN CONTENIDOS

SELECT * FROM CUSTOMERS
WHERE COUNTRY NOT LIKE 'B%'--TODOS LOS QUE NO COMIENCEN CON B, CUIDADO CON LOS ***NOT***

SELECT CUSTOMERID, COMPANYNAME, FAX FROM CUSTOMERS
WHERE FAX IS NOT NULL -- DEVULVAME TODOS LOS REGISTROS DE FAX LLENOS


SELECT CUSTOMERID, COMPANYNAME, FAX FROM CUSTOMERS
WHERE FAX IS  NULL -- DEVULVAME TODOS LOS REGISTROS DE FAX VACIOS

SELECT COUNT(FAX) FROM CUSTOMERS --CUENTA SOLO LOS REGISTROS LLENOS, LOS VALORES VACIOS NO

------EJEMPLO-----------------------------
USE PUBS
SELECT TITLE_ID AS CODIGO,TITLE AS LIBRO,TYPE AS TIPO FROM TITLES -- AS PARA RENOMBRAR
WHERE TYPE='psychology'                          -- UNA COLUMNA  
ORDER BY LIBRO DESC

USE NORTHWIND
SELECT COUNTRY,CUSTOMERID,CONTACTNAME, CONTACTTITLE FROM CUSTOMERS
ORDER BY COUNTRY ASC , CUSTOMERID DESC  -- ORDER BY PARA ORDENAR LA VISTA

SELECT 'NOMBRE COMPAÑIA: '+ COMPANYNAME + ', NOMBRE DEL CONTACTO: '
+ CONTACTNAME AS INFORMACION FROM CUSTOMERS -- MODIFICANDO EL FORMATO AGREGANDO TEXTOS CONCATENADOS

-----------------------
SELECT CUSTOMERS.CUSTOMERID, CONTACTNAME, ORDERID, ORDERDATE
FROM CUSTOMERS INNER JOIN ORDERS
ON CUSTOMERS.CUSTOMERID = ORDERS.CUSTOMERID
ORDER BY ORDERID
------

SELECT
CUSTOMERID
--,COMPANYNAME
,CONTACTNAME
FROM CUSTOMERS



SQL TRANSACT: Consultas Multitablas



La consulta de datos entre varias tablas obedece a una teoria de conjuntos, aqui se explica las instrucciones Join, Left Outer Join y Right Outer Join, Cross Join, para devolver datos de varias tablas.


SQL TRANSACT: Insert, Update, Delete



Como Agregar con la instrucción INSERT, Modificar con la instrucción UPDATE ó Eliminar con la instruccion DELETE los datos de una Tabla de una Base de Datos en SQL Sever 2008


SQL TRANSACT: Uso XML en SQL Server 2008



Instrucciones para realizar consultas y devolverlas en formato XML, o extraer un valor de un XML

---xml
---For XML  Raw , Auto, Explicit, Path

--consulta de las tablas customers y orders
--1.Ejemplo 1
Select Customers.CustomerID, Customers.CompanyName,
Orders.OrderID, Orders.OrderDate from Customers
inner join orders on
Customers.CustomerID=Orders.customerid
for xml raw
--2.Ejemplo 2

Select Customers.CustomerID, Customers.CompanyName,
Orders.OrderID, Orders.OrderDate from Customers
inner join orders on
Customers.CustomerID=Orders.customerid
for xml auto

----------For XML Explicit
--Informacion de customers y orders del customerid='ALFKI'

Select 1 as Tag,  null as parent,
customerid as [Cliente!1!customerid], contactname as [Cliente!1],
null as  [Orden!2!orderid],
null as [Orden!2]
from customers as C where customerid='ALFKI'
union
Select 2 as Tag, 1 as Parent, C.customerid,
C.contactName, o.orderid, o.shipaddress from
Customers as C inner join orders as o
on C.CustomerID=o.CustomerID
where C.CustomerID='ALFKI'
For xml Explicit

--resultado xml Anterior
<C customerid="ALFKI">Maria Anders
    <O orderid="10643">Obere Str. 57</O>
    <O orderid="10692">Obere Str. 57</O>
    <O orderid="10702">Obere Str. 57</O>
    <O orderid="10835">Obere Str. 57</O>
    <O orderid="10952">Obere Str. 57</O>
    <O orderid="11011">Obere Str. 57</O>
</C>

---uso de for xml path

Select Customers.CustomerID, Customers.CompanyName,
Orders.OrderID, Orders.OrderDate from Customers
inner join orders on
Customers.CustomerID=Orders.customerid
for xml path ('venta')

-----------uso de xml.query

declare @mydoc xml
set @mydoc='<root>
<productdescription productid="1" productname="rood bike">
<Features>
<warranty>1 año de garantia para partes</warranty>
<maintenance>3 años de mantenimiento</maintenance>
</Features>
</productdescription>
</root>'

Select @mydoc.query
('/root/productdescription/Features/maintenance')

-----------uso de xml.Value
declare @bicicleta varchar(100)
declare @mydoc xml
set @mydoc='<root>
<productdescription productid="1" productname="rood bike">
<Features>
<warranty>1 año de garantia para partes</warranty>
<maintenance>3 años de mantenimiento</maintenance>
</Features>
</productdescription>
</root>'

Set @bicicleta= @mydoc.value(
'(/root/productdescription/@productname)[1]', 'varchar(100)')

Select @bicicleta

SQL ADMINISTRACIÓN: Instalación




SLQ ADMINISTRACION: Creación de una Base de Datos



--Creación de una base de Datos

Create Database Ejemplo
on
Primary
( Name=EmploData,
filename='C:\Archivos de programa\Microsoft Sql server\ejemplo.mdf'
size=10MB,          --el Mínimo es 512Kb, el predeterminado es 1MB,
maxsize=15MB,
Filegrowth=20%      -- default es 10%, minimo es 64KB
)
log on
( Name=EmploData,
filename='C:\Archivos de programa\Microsoft Sql server\ejemplo.ldf'
size=3MB,          --el Mínimo es 512Kb, el predeterminado es 1MB,
maxsize=15MB,
Filegrowth=20%
)






Use ventas
go
/* opciones de bd
auto_close, auto_create_statistics, auto_shrink
auto_update_statistics

--cursores--

Cursor_close_on_commit

*/

Alter database ventas
SET Cursor_close_on_commit ON
GO --CIERRA CUALQUIER CURSOR AUTOMATICAMENTE

--PARA REVISAR ESTADO DE LAS OPCIONES

SELECT DATABASEPROPERTYEX('VENTAS','ISAUTOSHRINK')

--CONSULTAR INFORMACION DE GRUPOS
SP_HELPFILEGROUP GRUPOVENTAS
SP_HELPFILE VENTASDATA
USE MASTER
go
SP_HELP VENTAS

--CREACION DE GRUPOS

ALTER DATABASE Northwind
ADD FILEGROUP OrderHistoryGroup
GO
ALTER DATABASE Northwind
ADD FILE
( NAME = 'OrdHistYear1',
FILENAME = 'c:\Archivos de programa\
Microsoft SQL Server\MSSQL\Data\OrdHist1.ndf,
SIZE = 5MB),
TO FILEGROUP OrderHistoryGroup
GO

--modificar el grupo primario

USE master
GO
ALTER DATABASE MyDatabase
MODIFY FILEGROUP [PRIMARY] DEFAULT
GO


--Sintaxis Modificacion de la Base de datos

ALTER DATABASE baseDeDatos
{ ADD FILE < filespec > [ ,...n ] [ TO FILEGROUP
nombreGrupoDeArchivos ]
| ADD LOG FILE < filespec > [ ,...n ]
| REMOVE FILE nombreArchivoLógico [ WITH DELETE ]
| ADD FILEGROUP nombreGrupoDeArchivos
| REMOVE FILEGROUP nombreGrupoDeArchivos
| MODIFY FILE < filespec >
| MODIFY NAME = nuevoNombreBaseDatos
| MODIFY FILEGROUP nombreGrupoDeArchivos
{propiedadGrupoDeArchivos | NAME = nuevoNombreGrupoDeArchivos }
| SET < optionspec > [ ,...n ] [ WITH < termination > ]
| COLLATE < nombreIntercalación >
}


--modificar un archivo
USE master
GO
ALTER DATABASE Test1
MODIFY FILE
   (NAME = test1dat3,
   SIZE = 20MB)
GO





USE NORTHWIND
GO
SP_HELPdb northwind
dbcc shrinkdatabase (northwind,10) --10 es el porcentaje de espacio libre que quedara
dbcc shrinkfile(northwind,2) --Reduce a 2MB el archivo de datos

-----Romper el vínculo entre los archivos de la bd
use master
go
sp_detach_db 'northwind','true'
--vincular un archivo de base de datos
exec sp_attach_db 'Northwind'
,'C:\Archivos de programa\Microsoft SQL Server\MSSQL\Data\northwnd.mdf'
,'C:\Archivos de programa\Microsoft SQL Server\MSSQL\Data\northwnd.ldf'

--------Creacion de Instantaneas------------
CREATE DATABASE AdventureWorks_dbss1800 ON
( NAME = AdventureWorks_Data, FILENAME =
'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Data\AdventureWorks_data_1800.ss' )
AS SNAPSHOT OF AdventureWorks;
GO

SLQ ADMINISTRACION: Autenticación y Esquemas


SQL ADMINISTRACIÓN:  Creación de Tipos de Dato y  Tablas
--Crear Tipo de Dato personalizado
Create Type  city from  nvarchar(15) not NULL;

--Borrar tipo personalizado

Drop type city

-----Crear una Tabla--------------
USE VENTAS
CREATE TABLE dbo.InformacionCliente
(CodigoCliente int IDENTITY (1, 1) NOT NULL,--No nulos, int numeric o decimal
NombreCliente nvarchar(15) NOT NULL,        --IDENTITYCOL
ApellidoCliente nvarcHar(20) NOT NULL,
FechaNacimiento datetime NULL,
SALARIO money,
Picture image NULL,
[igss] AS ([Salario]*0.0483)
)

--ver las dependencias de una tabla
sp_depends


------Borrar una tabla------------
DROP TABLE DBO.INFORMACIONCLIENTE

------Agregar Columnas------------
ALTER TABLE CategoriesNew
ADD Commission money null

-----Borrar  Columnas-------------
ALTER TABLE CategoriesNew
DROP COLUMN Commission
Use northwind

Select IDENT_SEED('orders')--identity inicial
Select IDENT_INCR('orders')--identity incremento

---averiguar valores iniciales de identity-------------
USE northwind
SELECT TABLE_NAME, IDENT_SEED(TABLE_NAME) AS IDENT_SEED
FROM INFORMATION_SCHEMA.TABLES
WHERE IDENT_SEED(TABLE_NAME) IS NOT NULL

---@@identity, que determina el valor de la última fila insertada en
---una columna de identidasseld durante una sesión.

SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]
GO
/*SCOPE_IDENTITY devuelve el último valor de IDENTITY insertado
en una columna de identidad del mismo ámbito.
*/

--USO DE LA INSTRUCCION DBCC CHECKIDENT

--A. Restablecer el valor de identidad actual si es necesario
--En este ejemplo se restablece el valor de identidad actual, si es necesario, de la tabla jobs.

USE pubs
GO
DBCC CHECKIDENT (jobs)
GO

--B. Informar del valor de identidad actual
--En este ejemplo se informa del valor de identidad actual de la tabla jobs, y no se corrige el valor de identidad, si fuera incorrecto.

USE pubs
GO
DBCC CHECKIDENT (jobs, NORESEED)
GO

--C. Establecer el valor de identidad actual en 30
--En este ejemplo se establece el valor de identidad actual de la tabla jobs en 30.

USE pubs
GO
DBCC CHECKIDENT (jobs, RESEED, 30)
GO

--insertar valores ----------------

INSERT informacioncliente (codigocliente,NOMBRECLIENTE,APELLIDOCLIENTE,FECHANACIMIENTO,SALARIO)
VALUES(8,'LUIS','GARCIA','1998-1-1',8000)

--volver el identity valor explicito---------
Set IDENTITY_INSERT informacionCliente On



SQL ADMINISTRACIÓN:  Como realizar Backups y Restore


SQL ADMINISTRACIÓN:  Consultas de Paso a traves en SQL Server 2008



SQL ADMINISTRACIÓN:  Como Replicar en SQL Server 2008



SQL ADMINISTRACIÓN:  Transaction Log Shipping



Configuración de Trasvase de Registros en SQL Server de Microsoft


 SQL PROGRAMACIÓN CON TRANSACT: Creación de Indices


En este video conoceremos la diferencia entre un indice agrupado y un no agrupado, como son construidos en sql server y su funcionamiento.


 SQL PROGRAMACIÓN CON TRANSACT: Creación de Tablas e Indices Particionados




En esta leccion se explica como crear tablas e indices particionados, lo que permite repartir los datos de la tabla en diferentes discos, mejorando el tiempo de consulta de los datos al usar varios discos en paralelo.





SQL PROGRMACIÓN CON TRANSACT: Estimación de Planes de Ejecución

Introducción a la estimación de planes de ejecución de consultas en SQL Server 2008


 SQL PROGRAMACIÓN CON TRANSACT: Creación de Funciones


Las funciones resultan un hibrido entre vista y procedimiento almacenado, permitiendo enviar parametros a una consulta, en este video se revisa su funcionamiento.

Use northwind
go

--1.Creacion de Funciones Escalares
CREATE FUNCTION Iva  (@DATE money)
RETURNS money
AS
BEGIN
Declare @iva money
Set  @Iva=@date*.12
Return(@iva)
END

--3.Revisar la funcion debe de escribirse el nombre con dos partes
Select unitprice, dbo.iva(unitprice) as iva from [order details]

--4.borrar la funcion
drop function iva

--5.Otro ejemplo de funcion

CREATE Function Comision (@valor money)
ReturnS money
as
Begin
Declare @Resultado money
if @valor>=15
    BEGIN
         SET @RESULTADO= @VALOR * 1.10
    END
ELSE
    BEGIN
         SET @RESULTADO=@VALOR
    END
RETURN @RESULTADO
END

--ejecutar la funcion

SELECT UNITPRICE, DBO.Comision(UNITPRICE) FROM [ORDER DETAILS]


/* en una funcion no se pueden usar estas funciones no determiniestas
@@ERROR FORMATMESSAGE    IDENTITY     USER_NAME
@@IDENTITY   GETANSINULL NEWID    @@ERROR
@@ROWCOUNT   GETDATE PERMISSIONS @@IDENTITY
@@TRANCOUNT GetUTCDate   SESSION_USER     @@ROWCOUNT
APP_NAME     HOST_ID STATS_DATE   @@TRANCOUNT
CURRENT_TIMESTAMP         HOST_NAME     SYSTEM_USER
CURRENT_USER     IDENT_INCR   TEXTPTR
DATENAME     IDENT_SEED   TEXTVALID
*/

--6.Una función con valores de tabla de varias instrucciones es una combinación de una vista y un procedimiento almacenado.


CREATE FUNCTION LISTAPORPAIS (@PAIS  VARCHAR(50))
RETURNS @CLIENTES TABLE
(
CUSTOMERID VARCHAR(10), COMPANYNAME VARCHAR(50),CONTACTNAME VARCHAR(50) ,COUNTRY VARCHAR(50)
)
AS
BEGIN
INSERT @CLIENTES SELECT CUSTOMERID,COMPANYNAME,CONTACTNAME,COUNTRY FROM CUSTOMERS
WHERE COUNTRY=@PAIS
RETURN
END

--7.EJECUCION DE FUNCION
SELECT * FROM LISTAPORPAIS('GERMANY')

--8.Ejemplo de una función con valores de tabla en línea

CREATE FUNCTION DETALLEPEDIDO_FECHA (@INICIO DATETIME, @FIN DATETIME)
RETURNS TABLE
AS
RETURN
(
SELECT O.ORDERID,O.ORDERDATE,P.PRODUCTID, P.PRODUCTNAME,(OD.UNITPRICE * OD.QUANTITY) AS TOTAL
FROM ORDERS AS O INNER JOIN [ORDER DETAILS] AS OD
ON O.ORDERID=OD.ORDERID INNER JOIN PRODUCTS AS P
ON OD.PRODUCTID=P.PRODUCTID
WHERE O.ORDERDATE BETWEEN @INICIO AND @FIN
)

--Ejecutar la funcion

SELECT * FROM DBO.DETALLEPEDIDO_FECHA('1998-01-01','1998-31-12')



SQL PROGRAMACIÓN CON TRANSACT: Creación de Procedimientos Almacenados



El procedimiento almacenado es el objeto estrella y mas optimizado del SQL Server, en esta lección se aprenden los aspectos basicos de un procedimiento.


--1. Crea un procedimiento en la base de datos Activa
USE NORTHWIND
GO
CREATE PROC DBO.ORDENESNOENTREGADAS
AS
SELECT * FROM ORDERS WHERE ORDERDATE
BETWEEN '1996-01-01' AND '1996-31-12'
--2.Información de Procedimientos
EXEC SP_HELP ORDENESNOENTREGADAS
EXEC SP_DEPENDS ORDENESNOENTREGADAS
EXEC SP_HELPTEXT ORDENESNOENTREGADAS
EXEC SP_STORED_PROCEDURES
SELECT * FROM SYSOBJECTS
SELECT * FROM SYSCOMMENTS
SELECT * FROM SYSDEPENDS

--3.Ejecucion de un procedimiento
EXEC ORDENESNOENTREGADAS
sp_executesql ORDENESNOENTREGADAS --USAR SP_EXECUTESQL ES MAS OPTIMO PORQUE GENERA PLANES DE EJECUCION DINAMICAMENTE
EXEC ORDENESNOENTREGADAS WITH RECOMPILE --EXIGE QUE SE RECOMPILE UN NUEVO PLAN

--4.Agregar datos con Insert Into partiendo del resultado del procedimiento
CREATE TABLE [PEDIDOS96]
(
      [OrderID] [int]  NOT NULL ,
      [CustomerID] [nchar] (5)  ,
      [EmployeeID] [int] NULL ,
      [OrderDate] [datetime] NULL ,
      [RequiredDate] [datetime] NULL ,
      [ShippedDate] [datetime] NULL ,
      [ShipVia] [int] NULL ,
      [Freight] [money] NULL  DEFAULT (0),
      [ShipName] [nvarchar] (40)  NULL ,
      [ShipAddress] [nvarchar] (60)  NULL ,
      [ShipCity] [nvarchar] (15) NULL ,
      [ShipRegion] [nvarchar] (15)  NULL ,
      [ShipPostalCode] [nvarchar] (10)  NULL ,
      [ShipCountry] [nvarchar] (15)  NULL ,

)
ON [PRIMARY]

GO

INSERT INTO PEDIDOS96
EXEC ORDENESNOENTREGADAS
Select into

--5. Modificar el procedimiento almacenado
ALTER PROC DBO.ORDENESNOENTREGADAS
AS
SELECT * FROM ORDERS WHERE ORDERDATE
BETWEEN '1998-01-01' AND '1998-31-12'


--6.Para eliminar el procedimiento almacenado en la base de datos activa

DROP PROC DBO.ORDENESNOENTREGADAS

--7. Parametros de Entrada
CREATE Proc Insercion
@Tabla1 bit,@compañia varchar(50),@contacto varchar(50)
,@titulo varchar(50),@direccion varchar(50)

as
DECLARE @codigo varchar(50)
SET @codigo=substring(convert(varchar(10),rand()),3,5)
if @Tabla1=1
begin
insert suppliers (companyname,contactname,contacttitle,address)
values
(@compañia,@contacto,@titulo,@direccion)
end
else
begin
insert customers (customerid,companyname,contactname,contacttitle,address)
values
(@codigo,@compañia,@contacto,@titulo,@direccion)
end

--8. Ejecucion con Parametros de entrada
exec insercion
      @compañia='cardenas inc',@contacto='Luis',@titulo='Ing',@direccion='18calle 1-6 Z.1'


exec Insercion 0,'cardenas inc9','Victor Cardenas','Ing.','30av 23-56 Z.5'

--9.Recompilar un procedimiento Y ESTABLECER ERRORES
ALTER PROC TESTRECOMPILACION
@VALOR  INT
WITH RECOMPILE
AS
DECLARE @STRING VARCHAR(200)
SET @STRING='SELECT TOP '+ CONVERT(CHAR(1),@VALOR) + ' * FROM ORDERS ORDER BY ORDERID'
EXECUTE (@STRING)
IF @@ERROR<>0
BEGIN
PRINT 'EQUIVOCACION AL INGRESAR MAS DE UN PARAMETRO EN PARAMETRO DE ENTRADA'
END

--10.RECOMPILAR EL PROCEDIMEINTO
EXEC TESTRECOMPILACION 8 WITH RECOMPILE
--11.PROCEDIMIENTO SP_RECOMPILE
SP_RECOMPILE TESTRECOMPILACION

DBCC FREEPROCCACHE --Borra de la cache todos los planes de ejecucion

--12. Parametros de Salida

create Proc Salida
@pais varchar(50),
@valor1 int OUTPUT
as
Select * from customers where country=@pais
set @valor1=@@rowcount

DECLARE @TEST1 INT
exec salida 'Argentina',@TEST1
SELECT @TEST1


--13. Procedimientos extendidos

Use Master
go
EXEC master.dbo.xp_cmdshell 'dir c:\ '

EXEC master.dbo.sp_helptext xp_cmdshell --buscar el dll que realiza la funcion

--14. Escribir un mensaje de error

EXEC sp_addmessage
@msgnum = 50010,
@severity = 10,
@lang= 'us_english',
@msgtext = 'Solo se permite un digito',
@with_log = 'true'

exec sp_dropmessage 50010,'us_english'
use master
select * from sysmessages
sp_helptext sp_dropmessage

--15. Usar @@Error

ALTER PROC TESTRECOMPILACION
@VALOR  INT
WITH RECOMPILE
AS
DECLARE @STRING VARCHAR(200)
SET @STRING='SELECT TOP '+ CONVERT(CHAR(1),@VALOR) + ' * FROM ORDERS ORDER BY ORDERID'
EXECUTE (@STRING)
IF @@ERROR<>0
BEGIN
PRINT 'EQUIVOCACION AL INGRESAR MAS DE UN PARAMETRO EN PARAMETRO DE ENTRADA'
END

--16. usar el error con raiseeror

ALTER PROC TESTRECOMPILACION
@VALOR  INT
WITH RECOMPILE
AS
DECLARE @STRING VARCHAR(200)
SET @STRING='SELECT TOP '+ CONVERT(CHAR(1),@VALOR) + ' * FROM ORDERS ORDER BY ORDERID'
EXECUTE (@STRING)
IF @@ERROR<>0
BEGIN
RAISERROR(50010, 16, 1)
END
exec testrecompilacion 88

--17. borrar de caché todos lo planes de ejecucion
DBCC FREEPROCCACHE

---uso del Return
use pubs
go
CREATE PROCEDURE checkstate @param varchar(11)
AS
IF (SELECT state FROM authors WHERE au_id = @param) = 'CA'
   RETURN 1
ELSE
   RETURN 2

--revision del resultado

declare @rev int
exec @rev=checkstate '238-95-7766'
if @rev=1
begin
print 'bien'
end
else
begin
print 'mal'
end



SQL PROGRAMACIÓN CON TRANSACT: Creación de Triggers


Creación de Triggers en SQL 2008, Tipos de Triggers y su funcionamiento


USE NORTHWIND

GO

/*
CREATE TRIGGER [propietario.] nombreDesencadenador
ON [propietario.] nombreTabla
[WITH ENCRYPTION]
{FOR | AFTER | INSTEAD OF} {INSERT | UPDATE | DELETE}
AS
[IF UPDATE (nombreColumna)...]
[{AND | OR} UPDATE (nombreColumna)...]
instruccionesSQL}
Sintaxis
*/

--1.CREACION DE UN TRIGGER SOBRE LA TABLA ORDER DETAILS--
SELECT * FROM [ORDER DETAILS]
SELECT * FROM PRODUCTS

CREATE TRIGGER BUSCARPRECIO                --CREA EL TRIGUER
ON [ORDER DETAILS]                    --ON  ESPECIFICA LA TABLA
FOR INSERT                            --FOR ESFECIFICA EL EVENTO INSERT, UPDATE, DELETE
AS                            --AS ESPECIFICA EL CUERO
UPDATE [ORDER DETAILS] SET UNITPRICE=
(SELECT P.UNITPRICE FROM PRODUCTS AS P INNER JOIN INSERTED AS I
ON P.PRODUCTID=I.PRODUCTID)

--2.REVISION DEL TRIGGER--

INSERT [ORDER DETAILS](ORDERID,PRODUCTID,QUANTITY,DISCOUNT)
VALUES
(10248,47,6,0)

--3.BORRAR EL TRIGUER
DROP TRIGGER BUSCARPRECIO

--4.CREAR UN TRIGGER CON INSTEAD OF--

CREATE TRIGGER REVISARDETALLE
ON [ORDER DETAILS]
INSTEAD OF INSERT
AS
IF (SELECT ORDERID FROM INSERTED)=10248
BEGIN
RAISERROR('NO ES POSIBLE INGRESAR MAS DATOS A ESE PEDIDO',16,1)
ROLLBACK TRAN
END
ELSE
BEGIN
INSERT  [ORDER DETAILS] SELECT ORDERID,PRODUCTID,UNITPRICE,QUANTITY,DISCOUNT FROM INSERTED
END

--5.LOS TRIGGER SE PUEDEN ANIDAR HASTA 32 NIVELES PARA CAMBIAR EL NIVEL DE ANIDAMIENTO--
sp_configure 'nested triggers', 0

--6.PARA ACTIVAR LA RECURSIVADAD DE UN TRIGGER QUE ESTA DE FORMA PREDETERMINADA EN OFF-
ALTER DATABASE NORTHWIND
 SET RECURSIVE_TRIGGERS OFF

sp_dboption nombreBaseDatos, 'recursive triggers', True

--7.SI TIENE MAS DE UN TRIGGER EN LA MISMA TABLA PARA INDICAR EL ORDEN DE EJECUCION--

sp_settriggerorder @triggername= 'MyTrigger', @order='first', @stmttype = 'UPDATE'



ENVIAR CORREO ELECTRONICO DESDE SQL SERVER



Usando DataBase Mail para enviar correo electrónico desde SQL Server