Lomadee, uma nova espécie na web. A maior plataforma de afiliados da América Latina.

quarta-feira, 5 de outubro de 2011

SQL Server 2008 - Modulo 07 - Curso 6232

-- Aula 01 -- Variaveis


-- =============================================
-- Author:        Lineu Alves Lima
-- Create Date:   20/04/2010
-- Description:   Stored Procedure
-- =============================================
-- Versão:              1.0
-- =============================================

USE master
GO

IF EXISTS   (SELECT * FROM sys.databases
                   WHERE [name] = 'DB6232_SP')
DROP DATABASE DB6232_SP
GO

CREATE DATABASE DB6232_SP
GO

USE DB6232_SP
GO



-- *********************************************************
-- ***      Variáveis
-- *********************************************************

--SQL Server 2005

-- Declarando variáveis
DECLARE @Nome     VARCHAR(50)
DECLARE @Val      SMALLINT

-- Atribuindo valores as variáveis
SET   @Nome = 'Maria'
SELECT @Val = 975

-- Vizualizando os valores das variáveis
PRINT @Nome
PRINT @Val



--SQL Server 2008

-- Declarando e atribuindo valores as variáveis
DECLARE @Nome     VARCHAR(50) = 'Maria'
DECLARE @Val      SMALLINT    = 975

-- Vizualizando os valores das variáveis
PRINT @Nome
PRINT @Val





-- *********************************************************
-- ***      Dados para teste
-- *********************************************************

CREATE TABLE empregados
(
      id          INT                     IDENTITY          PRIMARY KEY,
      nome  VARCHAR(30)       NOT NULL,
      sexo  CHAR(01)          NOT NULL,
      sal         DEC(9,2)          NOT NULL,
      CONSTRAINT CH_test_sexo CHECK (sexo = 'F' OR sexo = 'M'),
      CONSTRAINT CH_test_sal  CHECK (sal >= 380)
)
GO

SET NOCOUNT ON
INSERT INTO empregados VALUES
('Maria', 'F', 10000), ('Silvana', 'F', 5000),
('Julia', 'F', 2000), ('Lineu', 'M', 380),
('Mario', 'M', 8000), ('Henrique', 'M', 5000),
('Júlio', 'M', 9000), ('Marco', 'M', 8000)

SELECT * FROM empregados


-- *********************************************************
-- ***      BEGIN, END, IF e ELSE
-- *********************************************************

IF (SELECT COUNT(*) FROM empregados) > 10
      BEGIN
            PRINT 'Esta tabela tem muitas linhas'
            PRINT 'É a lista de clientes da empresa.'
      END
ELSE
      -- BEGIN   --> Não é necessário neste caso, mas é uma boa prática usar.
            PRINT 'Esta tabela tem poucas linhas'
      -- END         --> Não é necessário neste caso, mas é uma boa prática usar.


-- *********************************************************
-- ***      CASE - WHEN - THEN - ELSE - END
-- *********************************************************

SELECT      id
            ,UPPER(nome)
            ,CASE sexo
                  WHEN 'F' THEN 'Feminino'
             ELSE
                  'Masculino'
             END
            ,sal = CASE
                  WHEN sal = 380 THEN 'Salário Mínimo'
                  WHEN sal BETWEEN 380 AND 2000 THEN 'Classe C'
                  WHEN sal BETWEEN 2001 AND 5000 THEN 'Classe B'
             ELSE
                  'Classe A'
             END
FROM empregados


--Aula 02 - Store Procedure

-- *********************************************************
-- ***      CREATE, ALTER and DROP Stored Procedures
-- *********************************************************

USE AdventureWorks
GO


-- Criando uma Stored Procedure
CREATE PROC Production.LongLeadProducts
-- Ou
-- CREATE PROCEDURE Production.LongLeadProducts
AS
      SELECT      Name, ProductNumber
      FROM  Production.Product
      WHERE DaysToManufacture >= 1
GO



-- Executando uma Stored Procedure
EXEC Production.LongLeadProducts



-- Alterando uma Stored Procedure
ALTER PROC Production.LongLeadProducts
AS
      SELECT      Name, ProductNumber, DaysToManufacture
      FROM  Production.Product
      WHERE DaysToManufacture >= 1
      ORDER BY DaysToManufacture DESC, Name
GO



-- Executando uma Stored Procedure
EXEC Production.LongLeadProducts



-- Verificando dependência
EXEC sp_depends 'Production.LongLeadProducts'



-- Deletando uma Stored Procedure
DROP PROC Production.LongLeadProducts



-- *********************************************************
-- ***      Stored Procedures - Input Parameters
-- *********************************************************

ALTER PROC Production.LongLeadProducts
      @MinimumLength INT = 1 -- default value
AS
IF (@MinimumLength < 0) -- validate
      BEGIN
            RAISERROR('Valor Inválido.', 14, 1)
            RETURN
      END

      SELECT Name, ProductNumber, DaysToManufacture
      FROM Production.Product
      WHERE DaysToManufacture >= @MinimumLength
      ORDER BY DaysToManufacture DESC, Name
GO


-- Chamando uma SP com valor DEFAULT
EXEC Production.LongLeadProducts


-- Chamando uma SP passando um valor como parâmetro
-- Passing by parameter name
EXEC Production.LongLeadProducts @MinimumLength = 2


-- Chamando uma SP passando um valor como parâmetro
-- Passing values by position
EXEC Production.LongLeadProducts 3


-- Validando o tratamento de erro da SP
EXEC Production.LongLeadProducts -22


-- Aula 03 Output Parameters and Return Values

-- **************************************************************
-- ***      Stored Procedures - Output Parameters and Return Values
-- **************************************************************

USE AdventureWorks
GO


CREATE PROC HumanResources.AddDepartment
      @Name nvarchar(50), @GroupName nvarchar(50),
      @DeptID smallint OUTPUT
AS
      INSERT INTO HumanResources.Department (Name, GroupName)
      VALUES (@Name, @GroupName)
      SET @DeptID = SCOPE_IDENTITY()
GO

-- Chamando a SP passando parâmetros e retornando valores
DECLARE @dept int
EXEC HumanResources.AddDepartment 'Refunds', '', @dept OUTPUT
SELECT @dept


-- Alterando a SP para melhorar o tratamento de erro
ALTER PROC HumanResources.AddDepartment
      @Name nvarchar(50), @GroupName nvarchar(50),
      @DeptID smallint OUTPUT
AS
IF ((@Name = '') OR (@GroupName = ''))
      RETURN -1
     
      INSERT INTO HumanResources.Department (Name, GroupName)
      VALUES (@Name, @GroupName)
     
      SET @DeptID = SCOPE_IDENTITY()
      RETURN 0
GO


-- Chamando a SP passando parâmetros e retornando valores
DECLARE @dept int, @result int
EXEC @result = HumanResources.AddDepartment 'Refunds2', 'e', @dept OUTPUT
IF (@result = 0)
      SELECT @dept
ELSE
      SELECT 'O registro não foi inserido.'
     

-- Aula 04 - Recompilando uma Store Procedure

-- **************************************************************
-- ***      Recompilando Stored Procedures e Limpando o Cache
-- **************************************************************

USE AdventureWorks
GO
EXEC sp_recompile 'Sales.Customer'
GO


-- Removes all elements from the procedure cache.
DBCC FREEPROCCACHE

-- Ou

DBCC FREEPROCCACHE WITH NO_INFOMSGS


-- Aula 05 - Apagando tabela

USE DB6232_SP
GO


-- Apagando tabela
DROP TABLE dbo.TabelaComPK



CREATE TABLE dbo.TabelaSemPK
(
      ColA        int,
      ColB        int
)
GO

CREATE TABLE dbo.TabelaComPK
(
      ColA        int         PRIMARY KEY,
      ColB        int
)
GO



ALTER PROCEDURE dbo.Insere @a int, @b int
AS
SET NOCOUNT ON
BEGIN TRY
      INSERT dbo.TabelaSemPK VALUES (@a, @b)
      INSERT dbo.TabelaComPK VALUES (@a, @b)
END TRY
BEGIN CATCH
      SELECT ERROR_NUMBER() ErrorNumber, ERROR_MESSAGE() [Message]
END CATCH
GO



EXEC dbo.Insere 1, 1
EXEC dbo.Insere 2, 2
EXEC dbo.Insere 1, 3 -- violates the primary key



SELECT * FROM TabelaSemPK
SELECT * FROM TabelaComPK



--TRUNCATE TABLE TabelaSemPK
--TRUNCATE TABLE TabelaComPK

-- Aula 06 - Limpando as tabelas

USE DB6232_SP
GO


-- Limpando as tabelas
TRUNCATE TABLE TabelaSemPK
TRUNCATE TABLE TabelaComPK


ALTER PROCEDURE dbo.Insere @a int, @b int
AS
SET NOCOUNT ON
BEGIN TRY
      BEGIN TRAN
            INSERT TabelaSemPK VALUES (@a, @b)
            INSERT TabelaComPK VALUES (@a, @b)
      COMMIT TRAN
END TRY
BEGIN CATCH
      ROLLBACK TRAN
      SELECT ERROR_NUMBER() ErrorNumber, ERROR_MESSAGE() [Message]
END CATCH
GO


EXEC dbo.Insere 1, 1
EXEC dbo.Insere 2, 2
EXEC dbo.Insere 1, 3 -- violates the primary key


SELECT * FROM TabelaSemPK
SELECT * FROM TabelaComPK


-- Aula 09 - Trabalhando com RAISERROR


-- *********************************************************
-- ***      Trabalhando com RAISERROR
-- *********************************************************

USE AdventureWorks
GO

DECLARE @DBID INT
SET @DBID = DB_ID()

DECLARE @DBNAME NVARCHAR(128)
SET @DBNAME = DB_NAME()

RAISERROR
    (N'The current database ID is: %d, the database name is: %s.',
    10, -- Severity.
    1, -- State.
    @DBID, -- First substitution argument.
    @DBNAME); -- Second substitution argument.
GO


-- *********************************************************
-- ***      Criando, Utilizando e Apagando mensagens de erro
-- *********************************************************

-- Criando uma mensagem
EXECUTE sp_addmessage 50005, 10, 'Não foi possível atualizar o registro!'
GO

-- Visualisando a mensagem
RAISERROR (50005, 10, 1)
GO

-- Apagando messanges
EXECUTE sp_dropmessage 50005
GO



-- Exemplo
EXECUTE sp_dropmessage 50005
GO



EXECUTE sp_addmessage 50005, -- Message id number.
    10, -- Severity.
    N'The current database ID is: %d, the database name is: %s.'
GO



DECLARE @DBID INT
SET @DBID = DB_ID()

DECLARE @DBNAME NVARCHAR(128)
SET @DBNAME = DB_NAME()

RAISERROR (50005,
    10, -- Severity.
    1, -- State.
    @DBID, -- First substitution argument.
    @DBNAME); -- Second substitution argument.
GO


-- Aula 10 -- Pivot Table



--exemplo pivot table

use master
go

IF EXISTS(SELECT NAME FROM SYS.DATABASES WHERE NAME = 'DB1')
DROP DATABASE DB1
GO

create database DB1
go

use DB1
go

create table venda (ano int, mes int, valor numeric(9,2))

insert venda values (2003, 2, 10)
insert venda values (2003, 2, 1)   
insert venda values (2003, 3, 20)
insert venda values (2003, 4, 30)
insert venda values (2004, 1, 40)
insert venda values (2004, 2, 50)
insert venda values (2004, 3, 60)
insert venda values (2004, 4, 70)
insert venda values (2005, 1, 80)

select * from venda order by 1,2,3

--select comun

select  ano

         , mes_1 = sum(case when mes=1 then valor end)

         , mes_2 = sum(case when mes=2 then valor end)

         , mes_3 = sum(case when mes=3 then valor end)

         , mes_4 = sum(case when mes=4 then valor end)

from venda

group by ano

order by ano;

--select com pivot



--Aula 11 --Procedure com Parametros


use [adventureworks]
go

-- 1 - procedure simples / sem parametro de entrada
create procedure usp_SalesOrderHeader
as
select * from Sales.SalesOrderHeader

exec usp_SalesOrderHeader

-- 2 - retorna o total do pedido de cada cliente e quantos pedidos existe para o cliente
create procedure usp_TotalPorCliente
as
select CustomerID,sum(TotalDue) as Total,count(SalesOrderID) as [Qtde. Total de Pedidos]
from Sales.SalesOrderHeader
group by CustomerID
order by [Qtde. Total de Pedidos] desc,Total

exec usp_TotalPorCliente

-- 3 - procedure com 1 parametro de entrada
-- descricao - retorna todas as vendas feitas pelo cliente
-- parametro - Customer
create procedure usp_VendaPorCliente
@customerID int
as
select * from Sales.SalesOrderHeader
where CustomerID = @customerID
order by OrderDate

exec usp_VendaPorCliente 11091

-- 4 - procedure com inner join / like / parametro de entrada
-- descricao - busca pelo nome do cliente as vendas
-- parametro - Customer
create procedure usp_VendaPorCliente_Nome
@nomeProduto nvarchar(50)
as
select p.Name,convert(money,sum(LineTotal)) as Total
from Sales.SalesOrderDetail s
inner join Production.Product p on(p.ProductID=s.ProductID)
where p.Name like '%'+@nomeProduto+'%'
group by p.Name

exec usp_VendaPorCliente_Nome Cl

-- alterando a prpocedure 4
-- ordenando pelos valores de venda
ALTER procedure [dbo].[usp_VendaPorCliente_Nome]
@nomeProduto nvarchar(50)
as
select p.Name,convert(money,sum(LineTotal)) as Total
from Sales.SalesOrderDetail s
inner join Production.Product p on(p.ProductID=s.ProductID)
where p.Name like '%'+@nomeProduto+'%'
group by p.Name
order by Total desc

-- 5 - procedure com 2 parametros de entrada
create procedure usp_VendasPorTerritorio
@group nvarchar(50),
@countryRegionCode nvarchar(3)
as
select * from Sales.SalesTerritory
where [Group] = @group and CountryRegionCode = @countryRegionCode

exec usp_VendasPorTerritorio 'Europe','FR'


--procedure com tratamento de erro
use master
go

create database DB1
go

use DB1
go

create table torcedores
(
      id int identity(1,1)
      ,nome varchar(50)
      ,time_do_coracao varchar(50)
)

--criando procedure
create procedure usp_insClientes
      @nome varchar(50),
      @time_do_coracao varchar(50),
      @id int output
as

if ((@nome) = '' or (@time_do_coracao = ''))
      return -1

insert into torcedores (nome,time_do_coracao) values (@nome,@time_do_coracao)

set @id = scope_identity()

return 0

--executando a procedure
declare @id int, @result int
exec @result = usp_insClientes 'Milena','Corinthians', @id output
if (@result = 0)
      select @id
else
      select 'Ocorreu um erro ao inserir registro.'

select * from torcedores



-- Aula 12 - Estrutura de Controle


-- estruturas de controle
-- usando if / then / else em procedures

-- 1 -
create procedure usp_VendasPorTerritorio
--criando os parametros
@group1 nvarchar(50),
@group2 nvarchar(50)
as

--criando as variaveis locais
declare @vendasUltimoAno1 money,@vendasUltimoAno2 money
declare @mensagem1 varchar(100),@mensagem2 varchar(100)

--definindo os valores para as variaveis
SET @vendasUltimoAno1 = (select sum(SalesLastYear) from Sales.SalesTerritory where [Group] = @group1)
SET @vendasUltimoAno2 = (select sum(SalesLastYear) from Sales.SalesTerritory where [Group] = @group2)

--estrutura de vcontrole if/then/else
if (@vendasUltimoAno1) > (@vendasUltimoAno2)
      begin
            set @mensagem1 = 'O grupo 1 vendeu mais que o grupo 2'
            print(@mensagem1)
      end
else
      begin
            set @mensagem2 = 'O grupo 2 vendeu mais que o grupo 1'
            print(@mensagem2)
      end


exec usp_VendasPorTerritorio 'Europe','Europe'

--alterando a procedure
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go


-- estruturas de controle
-- usando if / then / else em procedures

-- 1 -
ALTER procedure [dbo].[usp_VendasPorTerritorio]
--criando os parametros
@group1 nvarchar(50),
@group2 nvarchar(50)
as

--criando as variaveis locais
declare @vendasUltimoAno1 money,@vendasUltimoAno2 money
declare @mensagem1 varchar(100),@mensagem2 varchar(100),@mensagem3 varchar(100)

--definindo os valores para as variaveis
SET @vendasUltimoAno1 = (select sum(SalesLastYear) from Sales.SalesTerritory where [Group] = @group1)
SET @vendasUltimoAno2 = (select sum(SalesLastYear) from Sales.SalesTerritory where [Group] = @group2)

--estrutura de vcontrole if/then/else
if (@vendasUltimoAno1) > (@vendasUltimoAno2)
      begin
            set @mensagem1 = 'O grupo 1 vendeu mais que o grupo 2'
            print(@mensagem1)
      end
else
if (@vendasUltimoAno1) < (@vendasUltimoAno2)
      begin
            set @mensagem2 = 'O grupo 2 vendeu mais que o grupo 1'
            print(@mensagem2)
      end
else
      begin
            set @mensagem3 = 'O valor das vendas são iguais'
            print(@mensagem3)
      end

exec usp_VendasPorTerritorio 'Europe','Europe'





-- Aula 13 -- Estrutura de Repetição

--estrutura de repeticao while/continue
use master
go

--criando banco de dados
create database Soma
go

--criando a tabela
create table somaNatural
(
      numero int,
      somaAcunulada int
)

use Soma
go

create procedure usp_CalculaSoma
@numero int
as

--variavel para controlar o laco
declare @contador int
set @contador = 1

--variavel para a soma/inicia com valor zero
declare @soma int
set @soma = 0

while (@contador < @numero)
      begin
            set @soma = @soma + @contador
            insert into somaNatural values (@contador,@soma)
            set @contador = @contador + 1
      end

exec usp_CalculaSoma 10

select * from somaNatural

--alterando a procedure
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

ALTER procedure [dbo].[usp_CalculaSoma]
@numero int
as

--apagando os dados da tabela
delete from somaNatural

--variavel para controlar o laco
declare @contador int
set @contador = 1

--variavel para a soma/inicia com valor zero
declare @soma int
set @soma = 0

while (@contador < @numero)
      begin
            set @soma = @soma + @contador
            insert into somaNatural values (@contador,@soma)
            set @contador = @contador + 1
      end

exec usp_CalculaSoma 4

select * from somaNatural






-- Aula 14 - Procedure com parametros de saida

-- procedures com parametros de saida/entrada

-- procedure para retornar a media de vendas por grupo de regiao

use AdventureWorks
go

create procedure usp_MediaPorGrupo
     
      @group nvarchar(50),
      @media money output
as

      set @media = (select avg(SalesLastYear) from Sales.SalesTerritory where [Group] = @group)

--executando a procedure
declare @resultado money
exec usp_MediaPorGrupo 'Europe', @resultado output
print(@resultado)

-- Aula 15 - Procedure Criptografada


--alguns comandos

use AdventureWorks
go

sp_help usp_VendasPorTerritorio

--usp_VendasPorTerritorio    dbo   stored procedure  2010-05-25 10:08:47.883
--@group1   nvarchar    100   50    NULL  1     Latin1_General_CI_AS
--@group2   nvarchar    100   50    NULL  2     Latin1_General_CI_AS

sp_helptext usp_VendasPorTerritorio

--criando um procedure criptografada

create procedure usp_returnSales
WITH ENCRYPTION
as
select * from Sales.SalesPerson

exec usp_returnSales

sp_helptext usp_returnSales

--The text for object 'usp_returnSales' is encrypted.


-- Aula 16 - Tratamento de erro Try Catch


--tratamento de erro try/cath

use master
go

IF EXISTS(SELECT NAME FROM SYS.DATABASES WHERE NAME = 'DB1')
DROP DATABASE DB1
GO

create database DB1
go

use DB1
go

create table cidades_com_nomes_estranhos
(
      id int primary key,
      nome varchar(50)
)

--criando procedure com try/catch
create procedure usp_InsCidades
      @id int,
      @nome varchar(50)
as

begin try
      insert into cidades_com_nomes_estranhos (id,nome) values(@id,@nome)
end try

begin catch
      select ERROR_NUMBER() ErrorNumber, ERROR_MESSAGE() [Message]
end catch
go

exec usp_InsCidades 1,'Curralinho'
exec usp_InsCidades 2,'Jijoca de Jericoara'
exec usp_InsCidades 1,'Nhecolândia '

select * from cidades_com_nomes_estranhos

--***************************************************************************************
--procedure com try/catch - commit/rollback
use master
go

IF EXISTS(SELECT NAME FROM SYS.DATABASES WHERE NAME = 'DB1')
DROP DATABASE DB1
GO

create database DB1
go

use DB1
go

create table cidades_com_nomes_estranhos
(
      id int primary key,
      nome varchar(50)
)

create procedure usp_InsCidades
      @id int,@id1 int,
      @nome varchar(50),@nome1 varchar(50)
as

begin try
      begin tran
      insert into cidades_com_nomes_estranhos (id,nome) values(@id,@nome)
      insert into cidades_com_nomes_estranhos (id,nome) values(@id1,@nome1)
      commit tran
end try

begin catch
      rollback tran
      select ERROR_NUMBER() ErrorNumber, ERROR_MESSAGE() [Message]
end catch
go

exec usp_InsCidades 1,1,'Recursolândia','Chupinguaia'

select * from cidades_com_nomes_estranhos

Nenhum comentário:

Postar um comentário

Related Posts Plugin for WordPress, Blogger...