Tarefa Orientada 17 Scripts

Documentos relacionados
Tarefa Orientada 18 Procedimentos armazenados

Tarefa Orientada 9 Base de Dados Pagamentos

Tarefa Orientada 19 Triggers

Tarefa Orientada 8 Criação de tabelas

A U L A 1 0 C R I A N D O V I E W S V I E W S ( V I S Õ E S )

Tarefa Orientada 15 Manipulação de dados

f. Exemplo: verificar condição de aprovação de alunos

Bases de Dados 2007/2008. Aula 9

BANCO DE DADOS. Para a criação de um banco de dados, através de scripts SQL, deve-se usar a seguinte sintaxe: CREATE DATABASE <nome_banco_de_dados>

Banco de Dados I Introdução SQL

Tarefa Orientada 16 Vistas

Sistemas de Informação e Bases de Dados 2012/2013. Stored Procedures e Triggers

Uma solução possível para garantir, em ambiente APEX, a consistência duma estrutura ISA, total e disjuntiva.

WHILE = 0 -- Enquanto não é o fim do cursor, execute.

Introdução às funções e procedimentos. SQL suporta funções e procedimentos úteis com tipos de dados específicos

Lista 02 Sistema de Banco de Dados CAP 241 Computação Aplicada I

Linguagem SQL Restrições, Triggers e Views

Banco de Dados. Professora: Luciana Faria

FACULDADE INGÁ Unidade de Ensino Superior Ingá Ltda Ciência da Computação TRIGGERS. Prof. Erinaldo Sanches Nascimento

SQL CREATE DATABASE. MySQL, SQL Server, Access, Oracle, Sybase, DB2, e outras base de dados utilizam o SQL.

Marcos Alexandruk Marcos Alexandruk

Teste Exemplo Revisão da tentativa 1

Bases de Dados. Lab 1: Introdução ao ambiente. Figura 1. Base de dados de exemplo

SQL (Tópicos) Structured Query Language

Transacções. Vitor Vaz da Silva

Triggers(Gatilhos) Tiago Alves de Oliveira

Banco de dados. Conteúdo: DDL Prof. Patrícia Lucas

DDL DML DCL DTL Tipos Numéricos: INT FLOAT DOUBLE Tipos String: CHAR VARCHAR BINARY BLOB TEXT Tipos Data e Hora: DATE TIME TIMESTAMP YEAR

Tabelas. Banco de Dados I MySQL

Sumário. SQL - Criação de Tabelas. Structured Query Language. SQL Versões. André Restivo. October 18, 2010

Atualização e Inserção de Dados. SQL Avançado. Pedro F. Carvalho OCP Oracle g

Oracle Database 10g: Fundamentos de SQL e PL/SQL

Benvindo ao Curso de Introdução ao Firebird com Ferramenta de Relatórios!

Preparação. Linguagem de Manipulação de Dados (DML) Estudo Dirigido 10/12/2013

Programando em SQL. Triggers, Stored Procedures e funções. Profa. Késsia Marchi

Flickr, shindotv/ / BASES DE DADOS. Laboratórios de Informática João Paulo Barraca, André Zúquete, Diogo Gomes

A linguagem SQL

Utilizando o Postgres - comandos SQL para a manipulação de dados

Definição do esquema da base de dados. o esquema da BD é composto pelas definições de todas as tabelas da BD.

PSI Linguagem de Definição de dados. Módulo 15

Preparação criar tabela. Linguagem de Manipulação de Dados (DML) Estudo Dirigido 12/11/2018

Aula de SQL Comandos DDL. André Luiz de Oliveira Eduardo Raul Hruschka

Técni n c i as e L i L n i g n u g age g ns n p ara r Ba B nc n o d e D ados I ACCESS

26/04/2017 Triggers no SQL Server: teoria e prática aplicada em uma situação real

Projeto de Banco de Dados: Empresa X

José Antônio da Cunha

PCS3413. Engenharia de So-ware e Banco de Dados. Aula 20. Escola Politécnica da Universidade de São Paulo

Fundamentos de Programação ORACLE: SQL. Prof. Walter Gima

Oracle Database: Fundamentos de SQL e PL/SQL

Rápida revisão do Modelo Relacional

Tarefa Orientada 12 Junção Externa, Auto-Junção e União

IMPLEMENTAÇÃO DE BANCO DE DADOS

A Linguagem SQL. Tecnologia de Base de Dados. MSc. Eugénio. Macumbe

AULA 8. Ambientes Visuais 8.1. OBJETIVO DA AULA SQL (Structured Query Language)

Linguagem SQL (Parte I)

SQL Server Desenvolvedor

Tarefa Orientada 13 Agrupamento e sumário de dados

Tarefa Orientada 10 Obter informação a partir de uma tabela

INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DO RIO GRANDE DO NORTE INTRODUÇÃO A SQL

Comandos de Manipulação

Oracle Database 11g: Introdução à Linguagem SQL Novo

SQL BÁSICO. Luiz Antônio Vivacqua Corrêa Meyer

Bases de Dados. DDL Data Definition Language

Introdução à linguagem SQL

Material Teórico. Procedures, Functions, Exceptions e Triggers. Responsável pelo Conteúdo: Prof. Ms. Alexander Gobbato Albuquerque

E-BOOK GUIA RÁPIDO DE SQL W W W. T R E I N A W E B.C O M. B R

U.C Fundamentos de Bases de Dados Resolução e Critérios de Correção INSTRUÇÕES:

Sistemas de Informação e Bases de Dados 2012/2013. Restrições de Integridade em SQL

Bases de Dados. Lab 1: Introdução ao ambiente

TRIGGERS Temas abordados

Banco de Dados. -Aprendendo conceitos -Usando o SQL Conf para: -Conectar no banco de dados -Criar, alterar, excluir e consultar estruturas de tabelas

05/05/2017 Stored Procedures e Functions no MySQL com PhpMyAdmin

Avisos. Sumário. Atividade em lab Aula 29. Atividade em lab Aula 29. Programando com SQL Triggers EXERCÍCIO LAB SP. Vista da segunda prova

Programação em Banco de dados

Tarefa Orientada 14 Subconsultas

Triggers e Regras. Fernando Lobo. Base de Dados, Universidade do Algarve


Page 1. Prof. Constantino Jacob

Tarefa Orientada 11 Junção Interna

Conexão OLEDB do SQL Server 2005

BANCO DE DADOS GERENCIAL 1 A U L A 2

SISTEMAS DE INFORMAÇÃO

COMPETÊNCIAS ESPECÍFICAS Compreender e utilizar a linguagem SQL, na construção e manutenção de uma base de dados.

SQL Pacotes. Profa. Dra. Cristina Dutra de Aguiar Ciferri. Laboratório de Bases de Dados Pacotes

UNIVERSIDADE FEDERAL DA GRANDE DOURADOS PRÓ-REITORIA DE GRADUAÇÃO PROGRAD FACULDADE DE CIÊNCIAS EXATAS E TECNOLOGIA CURSO DE SISTEMAS DE INFORMAÇÃO

Licenciatura em Informática

Para criarmos um banco de dados no MySql, utilizamos à instrução:

15 - Introdução às Bases de Dados

BANCO DE DADOS PARA WEB

Conceitos básicos. Funcionario SIAPE Nome Lotacao Cargo Salario Admissao

Tarefa Orientada 4 Aplic. Manutenção de Produtos - ComboBox

A U L A 3 S U B G R U P O S D M L E D Q L : I N S E R I N D O E P E S Q U I S A N D O D A D O S E M U M A T A B E L A

Introdução ao PostgreSQL

Importar e Exportar Dados

SQL E MYSQL - COMANDOS BÁSICOS

Procedimentos armazenados

C A P I T U L O 10 F U N Ç Õ E S I N T E R N A S P H P P A R A B A N C O D E D A D O S

Transcrição:

Tarefa Orientada 17 Scripts Objectivos: Declaração de variáveis escalares Declaração de variáveis do tipo tabela Tabelas temporárias Estruturas Condicionais Estruturas de Repetição Tratamento de erros De um modo simplista, um script é um ficheiro que está dividido em um ou mais grupos que contêm uma série de instruções SQL. Cada grupo é executado como uma unidade. Para definir o fim de um grupo, utilize o comando GO. Não é necessário utilizar este comando para definir o fim do último grupo de um script, nem no caso do script ser constituído por apenas um grupo. 1 Formule, analise e execute as instruções a seguir apresentadas. 1.1 Script constituído por dois grupos. O primeiro cria uma base de dados e o segundo cria três tabelas nessa base de dados. CREATE DATABASE ClubeRicos GO USE ClubeRicos CREATE TABLE Membros (IDMembro int NOT NULL IDENTITY PRIMARY KEY, ÚltimoNome varchar(75) NOT NULL, PrimeiroNome varchar(50) NOT NULL) CREATE TABLE Comitês (IDComitê int NOT NULL IDENTITY PRIMARY KEY, Nome varchar(50) NOT NULL) CREATE TABLE MembrosComitês (IDMembro int NOT NULL REFERENCES Membros(IDMembro), IDComitê int NOT NULL REFERENCES Comitês(IDComitê)) Microsoft SQL Server 2005 1

Caso utilize num script as instruções CREATE VIEW, CREATE PROCEDURE, CREATE FUNCTION ou CREATE TRIGGER, deve criar um grupo para cada instrução. Declaração de variáveis escalares Para declarar uma variável, utilize a instrução DECLARE. O valor inicial de uma variável é sempre NULL. O nome da variável deve começar com o carácter @. A seguir apresenta-se a sintaxe para declarar uma variável. DECLARE @nome_variável Tipo_de_dados [, @nome_variável Tipo_de_dados] Uma variável à qual é associado um tipo de dados standard e que contém um único valor é comummente designada por variável escalar. Para atribuir um valor a uma variável, utilize a instrução SET. A seguir apresenta-se a sintaxe para atribuir um valor a uma variável. Por exemplo, no script abaixo apresentado, usa-se esta técnica para atribuir valores às variáveis @MaxFactura e @VarIDFornecedor. SET @nome_variável = expressão Alternativamente, também se pode atribuir um valor a uma variável a partir da lista de colunas de uma instrução SELECT. Por exemplo, no script seguinte usa-se esta técnica para atribuir valores às variáveis @MinFactura e @NúmFacturas. Microsoft SQL Server 2005 2

1.2 Script que ilustra a declaração e atribuição de valores a variáveis escalares. DECLARE @MaxFactura money, @MinFactura money DECLARE @VarIDFornecedor int, @NúmFacturas int SET @VarIDFornecedor = 122 SET @MaxFactura = (SELECT MAX(TotalFactura) FROM Facturas WHERE Fornecedor = @VarIDFornecedor) SELECT @MinFactura = MIN(TotalFactura), @NúmFacturas = COUNT(*) FROM Facturas WHERE Fornecedor = @VarIDFornecedor PRINT 'Factura mais dispendiosa: ' + CONVERT(varchar,@MaxFactura,1) + '.' PRINT 'Factura mais dispendiosa: ' + CONVERT(varchar,@MinFactura,1) + '.' PRINT 'Número de facturas: ' + CONVERT(varchar,@NúmFacturas) + '.' O resultado da execução do script anterior é o seguinte. O âmbito de uma variável é o grupo em que foi declarada, isto é, a variável não pode ser referenciada fora do grupo em que foi declarada. Microsoft SQL Server 2005 3

Declaração de variáveis do tipo tabela Também é possível declarar variáveis que possam armazenar o conteúdo de uma tabela, através da instrução DECLARE. DECLARE @nome_da_tabela TABLE (coluna1 tipo_de_dados [restrições_coluna1] [, coluna2 tipo_de_dados [restrições_coluna2]] [,restrições_tabela]) Note que, na declaração da variável, é utilizado o tipo de dados TABLE em vez de um tipo de dados standard. Depois, definem-se as colunas e as respectivas restrições de igual modo ao utilizado para criar uma tabela através da instrução CREATE TABLE. Tal como no caso das variáveis escalares, o âmbito de uma variável do tipo tabela é o grupo em que foi declarada. 1.3 Script que ilustra a declaração e atribuição de valores a variáveis do tipo tabela. DECLARE @MelhoresFornecedores table (IDFornecedor int, Nome varchar(50)) INSERT @MelhoresFornecedores SELECT IDFornecedor, Nome FROM Fornecedores WHERE IDFornecedor IN (SELECT Fornecedor FROM Facturas WHERE TotalFactura > 1000) SELECT * FROM @MelhoresFornecedores Neste exemplo, é declarada a variável @MelhoresFornecedores para que possa armazenar duas colunas: IDFornecedor e Nome. Depois é utilizada uma instrução INSERT para inserir, nessa variável, todos os fornecedores que têm facturas com montantes superiores a mil euros. Finalmente, é usada uma Microsoft SQL Server 2005 4

instrução SELECT para devolver o conteúdo da variável @MelhoresFornecedores. Note ainda que, neste exemplo, foi utilizada a variável do tipo tabela nas instruções INSERT e SELECT. Também pode utilizar uma variável do tipo tabela, em vez do nome de uma tabela, nas instruções UPDATE e DELETE. A única situação em que não pode usar uma variável do tipo tabela, no lugar do nome de uma tabela é na cláusula INTO de uma instrução SELECT INTO. Microsoft SQL Server 2005 5

Tabelas temporárias Uma tabela temporária existe apenas durante uma sessão da base de dados. Na aplicação Management Sudio, isto significa que a tabela apenas está disponível até que feche a janela onde criou a tabela. As tabelas temporárias são úteis para testar consultas ou para armazenar dados temporariamente num script complexo. As tabelas temporárias são armazenadas na base de dados do sistema tempdb. Se necessitar de eliminar uma tabela temporária antes do finalizar uma sessão, utilize o comando DROP TABLE. Uma tabela temporária está visível apenas dentro da sessão corrente. Para identificar uma tabela temporária local, anteceda o nome da tabela com o carácter #. 1.4 Script que ilustra a utilização de uma tabela temporária. SELECT TOP 5 Fornecedor, AVG(TotalFactura) AS [Montante médio das facturas] INTO #MelhoresFornecedores FROM Facturas GROUP BY Fornecedor ORDER BY [Montante médio das facturas] DESC SELECT Facturas.Fornecedor, MAX(DataFactura) AS [Factura mais recente] FROM Facturas JOIN #MelhoresFornecedores ON Facturas.Fornecedor = #MelhoresFornecedores.Fornecedor GROUP BY Facturas.Fornecedor Neste exemplo, é criada uma tabela temporária com o nome #MelhoresFornecedores através da instrução SELECT INTO. Esta tabela temporária contém o identificador do fornecedor e a média do montante das respectivas facturas dos fornecedores que têm os cinco maiores montantes médios das facturas. Depois, a segunda instrução SELECT realiza uma junção interna entre a tabela temporária e a tabela Fornecedores, de modo a devolver a data das facturas mais recentes desses fornecedores. Microsoft SQL Server 2005 6

Note ainda que, apesar de a tabela temporária ser armazenada noutra base de dados (tempdb), não é necessário especificar o nome dessa base de dados, pois o nome da tabela identifica-a como sendo uma tabela temporária. Microsoft SQL Server 2005 7

Estruturas Condicionais Pode utilizar a instrução IF ELSE para testar uma expressão condicional. Se essa expressão for verdadeira, as instruções que seguem a palavra-chave IF são executadas. Caso contrário, as instruções seguintes à palavra-chave ELSE são executadas, se essa palavra-chave estiver incluída. IF expressão_condicional {Instrução BEGIN END} [ELSE {Instrução BEGIN END}] 1.5 Script que ilustra a utilização de uma instrução IF ELSE. DECLARE @MenorDívida money, @MaiorDívida money DECLARE @MenorDataDívida smalldatetime DECLARE @MaiorDataDívida smalldatetime SELECT @MenorDívida = MIN(TotalFactura - Pagamento - Crédito), @MaiorDívida = MAX(TotalFactura - Pagamento - Crédito), @MenorDataDívida = MIN(DataVencimentoFactura), @MaiorDataDívida = MAX(DataVencimentoFactura) FROM Facturas WHERE TotalFactura - Pagamento - Crédito > 0 IF @MenorDataDívida < GETDATE() BEGIN PRINT 'Facturas por liquidar em atraso relativamente à data de pagamento!' PRINT 'Datas em dívida de' + CONVERT(varchar,@MenorDataDívida,1) + ' até ' + CONVERT(varchar,@MaiorDataDívida,1) + '.' PRINT 'Montante em dívida desde ' + CONVERT(varchar,@MenorDívida,1) + ' a ' + CONVERT(varchar,@MaiorDívida,1) + '.' END ELSE --@MenorDataDívida >= GETDATE() PRINT 'Não existem facturas com atrasos de pagamento' Neste exemplo utiliza-se uma instrução SELECT para atribuir valores a quatro variáveis. As variáveis @MenorDívida e @MaiorDívida vão conter os valores das facturas não saldadas que têm a menor e a maior dívida, respectivamente. As variáveis @MenorDataDívida e @MaiorDataDívida vão Microsoft SQL Server 2005 8

conter as datas das facturas não saldadas que têm a menor (mais antiga) e a maior (mais recente) data de vencimento, respectivamente. Se a data de dívida mais antiga for inferior à data do sistema (devolvida pela função GETDATE), devem ser apresentadas três mensagens. Caso contrário, é apresentada a mensagem Não existem facturas com atrasos de pagamento. A seguir, apresenta-se o resultado da execução do script anterior. Pode aninhar instruções IF ELSE dentro de instruções IF ELSE. Antes de trabalhar com um objecto da base de dados, deve-se assegurar que o objecto existe. Do mesmo modo, antes de criar um novo objecto, também se deve garantir que esse objecto ainda não existe. Para tal, utilize as funções OBJECT_ID e DB_ID. A função OBJECT_ID permite verificar a existência de uma tabela, de uma vista, de um procedimento armazenado, de uma função definida pelo utilizador ou de um trigger. A seguir apresenta-se a sintaxe para a função OBJECT_ID. OBJECT_ID( nome_do_objecto ) A função DB_ID permite verificar a existência de uma base de dados. A seguir apresenta-se a sintaxe para a função DB_ID. DB_ID( nome_da_base_de_dados ) Microsoft SQL Server 2005 9

Ambas as funções devolvem um valor nulo, caso o objecto não exista. Caso contrário, devolvem o número de identificação desse objecto. 1.6 Script que verifica se existe uma determinada base de dados antes de a eliminar. USE master IF DB_ID('Teste') IS NOT NULL DROP DATABASE Teste CREATE DATABASE Teste 1.7 Script que verifica se existe a tabela CópiaFacturas na base de dados corrente. IF OBJECT_ID('CópiaFacturas') IS NOT NULL DROP TABLE CópiaFacturas 1.8 Maneira alternativa de verificar a existência da tabela CópiaFacturas na base de dados corrente. IF EXISTS (SELECT * FROM sys.tables WHERE name = 'CópiaFacturas') DROP TABLE CópiaFacturas 1.9 Código que verifica a existência de uma tabela temporária. SELECT * FROM #MelhoresFornecedores IF OBJECT_ID('#MelhoresFornecedores') IS NOT NULL DROP TABLE #MelhoresFornecedores SELECT * FROM #MelhoresFornecedores Microsoft SQL Server 2005 10

Estruturas de repetição Para executar repetidamente uma instrução ou um conjunto de instruções, utilize o comando WHILE. WHILE expressão_condicional {Instrução BEGIN END} [BREAK] [CONTINUE] A(s) intrução(ões) contida(s) num comando WHILE são repetidas enquanto a expressão condicional for verdadeira. Para sair de um ciclo WHILE sem testar a expressão condicional, utilize a instrução BREAK. Para voltar ao início de um ciclo WHILE sem executar quaisquer instruções adicionais no ciclo, utilize a instrução CONTINUE. 1.10 Apesar de este Script representar uma situação não muito realista, serve para ilustrar a utilização de um ciclo WHILE. Um exemplo mais realista seria usar um ciclo WHILE para processar cursores. Voltaremos a este assunto mais tarde. IF OBJECT_ID('tempdb..#CópiaFacturas') IS NOT NULL DROP TABLE #CópiaFacturas SELECT * INTO #CópiaFacturas FROM Facturas WHERE TotalFactura - Pagamento - Crédito > 0 WHILE (SELECT SUM(TotalFactura - Pagamento - Crédito) FROM #CópiaFacturas) >= 50000 BEGIN UPDATE #CópiaFacturas SET Crédito = Crédito +.01 WHERE TotalFactura - Pagamento - Crédito > 0 END IF (SELECT MAX(Crédito) FROM #CópiaFacturas) > 3000 BREAK ELSE --(SELECT MAX(Crédito) FROM #CópiaFacturas) <= 3000 CONTINUE SELECT DataFactura, TotalFactura, Crédito FROM #CópiaFacturas Microsoft SQL Server 2005 11

Neste script começasse por criar uma tabela temporária com o nome #CópiaFacturas que vai conter as facturas ainda por saldar da tabela Facturas. Depois, a expressão de teste do ciclo WHILE inclui uma instrução SELECT para devolver o montante total em dívida das facturas por saldar. Caso esse montante for superior ou igual a 50000 euros, as restantes instruções são executas. Caso contrário, o ciclo acaba. A instrução UPDATE englobada no ciclo actualiza o valor do campo crédito da tabela temporária em 1%, para as facturas ainda por saldar. Note que apesar da tabela inicialmente apenas conter facturas por saldar, essa situação pode alterar-se à medida que os créditos vão sendo aplicados dentro do ciclo. Depois, é utilizada uma instrução IF ELSE para verificar se o montante máximo do crédito é superior a 3000 euros. Em caso afirmativo, Usa-se uma instrução BREAK para terminar abruptamente o ciclo. Caso contrário, é utilizada uma instrução CONTINUE, de modo a que o controlo volte automaticamente ao início do ciclo. Depois, a condição do teste é avaliada novamente e repetem-se os passos descritos anteriormente. Note que, neste caso a instrução CONTINUE não é necessária, pois é a última instrução do ciclo; o que significa que o controlo voltaria, na mesma, ao início do ciclo. A instrução CONTINUE pode ser utilizada numa cláusula IF para desviar as restantes instruções do ciclo. Contudo, tal como no caso da utilização da instrução BREAK, isto torna a leitura do código mais difícil. A seguir, apresenta-se o resultado da execução do script anterior. Microsoft SQL Server 2005 12

Tratamento de erros Para efectuar o tratamento de erros pode utilizar a instrução TRY CATCH. Este procedimento também se pode designar por tratamento de excepções. BEGIN TRY {Instrução_SQL bloco_de_instruções} END TRY BEGIN CATCH {Instrução_SQL bloco_de_instruções} END CATCH Quando ocorre um erro numa instrução incluída num bloco TRY, o controlo é passado para o bloco CATCH onde o erro pode ser processado. Se não ocorrer nenhum erro nas instruções do bloco TRY, o bloco CATCH é ignorado. Para dar uma informação mais personalizada acerca do erro, pode utilizar as seguintes funções dentro de um bloco CATCH. ERROR_NUMBER() devolve o número do erro ERROR_MESSAGE() devolve a mensagem associada ao erro ERROR_SEVERITY() devolve a severidade do erro ERROR_STATE() devolve o estado do erro Os erros com uma severidade igual ou inferior a 10 são considerados Warnings e não são tratados pela instrução TRY CATCH. Por outro lado, erros que tenham uma severidade igual ou superior a 20 e que causem o fecho da ligação à base de dados também não são tratados pela instrução TRY CATCH. Microsoft SQL Server 2005 13

1.11 Script que ilustra a utilização da instrução TRY CATCH. GO BEGIN TRY INSERT Facturas VALUES (20, 799, 'ZXK-799', '2006-07-01', 299.95, 0, 0, 1, '2006-08-01', NULL) PRINT 'SUCCESSO: O registo foi inserido.' END TRY BEGIN CATCH PRINT 'FALHA: O registo não foi inserido.' -- Pode utilizar uma instrução SELECT para devolver -- um resultado que contenha dados sobre o erro SELECT ERROR_NUMBER() AS [Número do erro], ERROR_MESSAGE() AS [Mensagem de erro] END CATCH Na instrução INSERT incluída no bloco TRY foi utilizado um identificador de fornecedor que não existe na tabela de fornecedores, o que implica que seja gerado um erro de integridade referencial. O erro vai ser apanhado pelo bloco CATCH e as instruções incluídas nesse bloco vão ser executadas. A seguir, apresenta-se o resultado da instrução SELECT interior ao bloco CATCH. A seguir, apresenta-se o resultado da instrução PRINT interior ao bloco CATCH. Microsoft SQL Server 2005 14

A seguir, apresentam-se alguns comandos que são comummente utilizados na implementação de scripts. USE passa a utilizar a base de dados especificada. PRINT devolve uma mensagem para o cliente. Se o cliente for o Management Studio, por exemplo, a mensagem è mostrada no tabulador Messages do editor de consultas. EXEC executa uma instrução de SQL dinâmica ou um procedimento armazenado. Microsoft SQL Server 2005 15