Você está na página 1de 18

Consultas SQL Server

1 - MANIPULAO DE DADOS
SELECT select_list
[ INTO new_table_name ]
FROM table_list
[ WHERE search_conditions ]
[ GROUP BY group_by_list ]
[ HAVING search_conditions ]
[ ORDER BY order_list [ ASC | DESC ] ]
select_list
Descreve as colunas do conjunto de resultados. uma lista de expresses separadas por vrgulas.
Cada expresso define o formato (tipo de dados e tamanho) e a fonte dos dados para a coluna do
conjunto de resultados. Cada expresso de lista de seleo tipicamente uma referncia a uma
coluna na tabela de origem ou exibio de onde os dados provm, mas pode ser qualquer outra
expresso, como uma constante ou uma funo Transact-SQL. O uso da expresso * em uma lista
de seleo especifica que todas as colunas da tabela de origem so retornadas.
INTO new_table_name
Especifica que o conjunto de resultados usado para criar uma nova tabela. new_table_name
especifica o nome da tabela nova.
FROM table_list
Contm uma lista das tabelas das quais os dados do conjunto de resultados so recuperados. Essas
fontes podem ser:

Tabelas base no servidor local que executa o SQL Server.


Exibies na instncia local do SQL Server. O SQL Server resolve internamente uma referncia de
exibio para referncias nas tabelas base que compem a exibio.
Tabelas vinculadas. So tabelas em fontes de dados OLE DB que podem ser acessadas pelo SQL
Server. Isso referido como consulta distribuda. Fontes de dados OLE DB podem ser acessadas no
SQL Server vinculando-as como servidor vinculado ou referenciando a fonte de dados em uma
funo OPENROWSET ou OPENQUERY.
A clusula FROM tambm pode conter especificaes de juno. Isso define o caminho especfico
que o SQL Server dever usar para navegar de uma tabela para outra.
A clusula FROM tambm usada nas instrues DELETE e UPDATE para definir as tabelas que so
modificadas.
WHERE search_conditions
A clusula WHERE um filtro que define as condies que cada linha das tabelas de origem deve
atender para qualificar-se para a clusula SELECT. Apenas linhas que atendem s condies
colaboram com dados para o conjunto de resultados. Dados de linhas que no atendem s condies
no so usados.

Desenvolvido por: Alexandre G. Silva


TOTVS ES

Pg. 1 de 18
04/09/2010

Consultas SQL Server


A clusula WHERE tambm usada nas instrues DELETE e UPDATE para definir as linhas nas
tabelas de destino que so modificadas.
GROUP BY group_by_list
A clusula GROUP BY divide o conjunto de resultados em grupos baseados nos valores das colunas
do group_by_list. Por exemplo, a tabela AdventureWorks Sales.SalesOrderHeader tem dez
valores em TerritoryID. Uma clusula GROUP BY TerritoryID divide o conjunto de resultados em
10 grupos, um para cada valor de TerritoryID.
HAVING search_conditions
A clusula HAVING um filtro adicional que aplicado ao conjunto de resultados. Logicamente, a
clusula HAVING filtra linhas do conjunto de resultados intermedirio construdo com a aplicao de
quaisquer clusulas FROM, WHERE ou GROUP BY na instruo SELECT. As clusulas HAVING so
tipicamente usadas com uma clusula GROUP BY, embora uma clusula GROUP BY no seja
necessria antes de uma clusula HAVING.
ORDER BY order_list[ ASC | DESC ]
A clusula ORDER BY define a ordem na qual so classificadas as linhas no conjunto de resultados.
order_list especifica as colunas do conjunto de resultados que compem a lista de classificao. As
palavras-chaves ASC e DESC so usadas para especificar se as linhas so classificadas em seqncia
ascendente ou descendente.
ORDER BY importante porque a teoria relacional especifica que no se pode pressupor que as
linhas de um conjunto de resultados tenham qualquer seqncia, a menos que ORDER BY seja
especificado. ORDER BY deve ser usado em qualquer instruo SELECT para a qual a ordem das
linhas do conjunto de resultados seja importante.
As clusulas de uma declarao SELECT devem ser especificadas na ordem adequada.
Cada referncia a um objeto do banco de dados deve ser inequvoca. A ambigidade pode vir das
seguintes fontes:

Pode haver vrios objetos que tm o mesmo nome em um sistema. Por exemplo, Schema1 e
Schema2 podem ter uma tabela nomeada TableX. Para resolver a ambigidade e especificar o
objeto TableX possudo por Schema1, qualifique o nome de tabela pelo menos com o nome do
esquema:
Exemplo:
SELECT *
FROM Schema1.TableX

O banco de dados no qual o objeto reside pode nem sempre ser o banco de dados atual quando a
instruo SELECT executada. Para ter certeza de que o objeto correto sempre usado,
independentemente da configurao do banco de dados atual, qualifique o nome de objeto com o
banco de dados e o esquema:
Exemplo:
SELECT *
FROM AdventureWorks.Purchasing.ShipMethod
Desenvolvido por: Alexandre G. Silva
TOTVS ES

Pg. 2 de 18
04/09/2010

Consultas SQL Server

As tabelas e exibies especificadas na clusula FROM podem ter nomes de coluna duplicados.
Freqentemente, chaves estrangeiras tero o mesmo nome de coluna que sua chave primria
relacionada. Para resolver a ambigidade entre nomes duplicados, o nome de coluna deve ser
qualificado com o nome da tabela ou nome de exibio:
Exemplo:
SELECT DISTINCT Sales.Customer.CustomerID, Sales.Store.Name
FROM Sales.Customer JOIN Sales.Store ON
( Sales.Customer.CustomerID = Sales.Store.CustomerID)
WHERE Sales.Customer.TerritoryID = 1
Essa sintaxe fica muito grande quando os nomes de tabela e de exibio tiverem que ser
qualificados completamente. Voc pode resolver esse problema atribuindo um nome de correlao,
tambm conhecido como uma varivel de intervalo ou alias, tabela, usando a palavra-chave AS na
clusula FROM. O nome de tabela ou de exibio completamente qualificado tem de ser especificado
apenas na clusula FROM. Todas as outras referncias a tabelas ou exibies podem ento usar o
nome de correlao. Aplicar nomes de correlao e qualificar as tabelas completamente na amostra
anterior cria esta instruo SELECT:
Exemplo:
SELECT DISTINCT c.CustomerID, s.Name
FROM Sales.Customer AS c
JOIN
Sales.Store AS s
ON ( c.CustomerID = s.CustomerID)
WHERE c.TerritoryID = 1
Para obter mais informaes sobre qualificao de objeto, consulte Identificadores.
Nos Manuais Online do SQL Server, muitos exemplos de Transact-SQL esto simplificados por no se
usarem nomes qualificados. Embora esses elementos no estejam includos nos exemplos, a fim de
facilitar a legibilidade, recomendamos que voc use nomes qualificados em instrues Transact-SQL
em sistemas de produo.

Desenvolvido por: Alexandre G. Silva


TOTVS ES

Pg. 3 de 18
04/09/2010

Consultas SQL Server


Funes de agregao.
FUNO

DESCRIO

MIN()

Menor valor do conjunto de valores passados como parmetro.

MAX()

Maior valor do conjunto de valores passados como parmetro.

AVG()

Mdia normal do conjunto de valores passados como parmetro.

SUM()

Soma do conjunto de valores passados como parmetro.

COUNT()

Contador do tipo de valores passados como parmetro.

Operadores lgicos.
OPERADOR

DESCRIO

Igualdade

<>

Desigualdade

>

Maior que

<

Menor que

>=

Maior ou igual a

<=

Menor ou igual a

!>

No maoir que

!<

No menor que

!=

No igual

Fonte de pesquisa: http://go.microsoft.com/fwlink/?LinkID=127251

Desenvolvido por: Alexandre G. Silva


TOTVS ES

Pg. 4 de 18
04/09/2010

Consultas SQL Server


2 - TRABALHANDO COM MLTIPLAS TABELAS
As condies de juno podem ser especificadas nas clusulas FROM ou WHERE, sendo
recomendado que sejam especificadas na clusula FROM. As clusulas WHERE e HAVING tambm
podem conter critrios de pesquisa para filtrar ainda mais as linhas selecionadas pelas condies de
juno.
As junes podem ser categorizadas como:

Junes internas (a operao de juno tpica como a que usa algum operador de comparao como
= ou <>). Esses incluem junes naturais e junes por igualdade.
As junes internas usam um operador de comparao para relacionar duas tabelas com base nos
valores em colunas comuns de cada tabela. Por exemplo, ao recuperar todas as linhas em que o
nmero de identificao do aluno o mesmo em ambas as tabelas alunos e cursos.

Junes externas. As junes externas pode ser uma juno externa esquerda, direita ou juno
externa completa.
As junes externas so especificadas com um dos seguintes conjuntos de palavras-chave quando
elas so especificadas na clusula FROM:

LEFT JOIN ou LEFT OUTER JOIN


O conjunto de resultados de uma juno externa inclui todas as linhas de uma tabela esquerda
especificadas na clusula LEFT OUTER, no somente aquelas nas quais as colunas unidas se
correspondem. Quando uma linha na tabela esquerda no possui linhas correspondentes na tabela
direita, a linha associada ao conjunto de resultados conter valores nulos para todas as colunas da
lista de seleo vindos da tabela direita.

RIGHT JOIN ou RIGHT OUTER JOIN


Uma juno externa direita o oposto de uma juno externa esquerda. So retornadas todas as
linhas da tabela direita. So retornados valores nulos para a tabela esquerda sempre que uma
tabela direita no possuir alguma linha de correspondncia na tabela esquerda.

FULL JOIN ou FULL OUTER JOIN


Uma juno externa completa retorna todas as linhas em ambas as tabelas direita e esquerda.
Sempre que uma linha no tiver correspondncia com a outra tabela, as colunas da lista de seleo
da outra tabela contero valores nulos. Quando houver correspondncia entre as tabelas, todas as
linhas do conjunto de resultados contero valores de dados de tabelas base.

CROSS JOIN
Uma juno cruzada sem uma clusula WHERE produz o produto cartesiano das tabelas envolvidas
na juno. O tamanho do conjunto de resultados do produto cartesiano o nmero de linhas na
primeira tabela multiplicado pelo nmero de linhas na segunda tabela. O exemplo a seguir mostra
juno cruzada Transact-SQL.

Desenvolvido por: Alexandre G. Silva


TOTVS ES

Pg. 5 de 18
04/09/2010

Consultas SQL Server


Exemplo:
USE AdventureWorks;
GO
SELECT p.SalesPersonID, t.Name AS Territory
FROM Sales.SalesPerson p
CROSS JOIN Sales.SalesTerritory t
ORDER BY p.SalesPersonID;
O conjunto de resultados contm 170 linhas (SalesPerson tem 17 linhas e SalesTerritory tem 10; 17
multiplicado por 10 igual a 170).
Porm, se uma clusula WHERE for adicionada, a juno cruzada se comportar como uma juno
interna. Por exemplo, a consulta Transact-SQL a seguir produz o mesmo conjunto de resultados.
Exemplo:
USE AdventureWorks;
GO
SELECT p.SalesPersonID, t.Name AS Territory
FROM Sales.SalesPerson p
CROSS JOIN Sales.SalesTerritory t
WHERE p.TerritoryID = t.TerritoryID
ORDER BY p.SalesPersonID;
-- Or
USE AdventureWorks;
GO
SELECT p.SalesPersonID, t.Name AS Territory
FROM Sales.SalesPerson p
INNER JOIN Sales.SalesTerritory t
ON p.TerritoryID = t.TerritoryID
ORDER BY p.SalesPersonID;

Fonte: http://go.microsoft.com/fwlink/?LinkID=127303

Desenvolvido por: Alexandre G. Silva


TOTVS ES

Pg. 6 de 18
04/09/2010

Consultas SQL Server


3 - EXERCCIOS
1 - Selecione os nomes, em ordem alfabtica, de todos os funcionrios da Matriz (filial 1), bem como
o cdigo da filial.
2 - Selecione o cdigo do tipo de movimento, o nome, o valor bruto, numero do movimento e data
de emisso.
3 - Selecione a quantidade de ordem de compras agrupando pelo ms de emisso.
4 - Selecione a soma dos lanamentos financeiros a receber que esto em aberto agrupados por
fornecedor.
5 - Faa uma listagem de produtos contendo o cdigo do produto, nome, unidade de controle,
unidade de venda, unidade de compra de todos os produtos da tabela de produtos. Ordenar os
produtos por cdigo.

6 Listagem de produtos que foram movimentados no ms de abril de 2005 no movimento de


ordem de compras, trazer o cdigo do produto, nome fantasia, numero do movimento, data de
emisso e valor liquido.

7 Liste os produtos que tiveram ordem de compra cujo o valor total do item seja maior que
1000(mil), trazer como informao: numero do movimento, numero de sequncia, cdigo do
produto, valor total.

8 listar todas as ordens de compra que no estiverem canceladas e foram emitidas no ms de


fevereiro de 2006, trazendo o numero da ordem de compra, o valor bruto, valor liquido, subtotal.

Desenvolvido por: Alexandre G. Silva


TOTVS ES

Pg. 7 de 18
04/09/2010

Consultas SQL Server


4 TRABALHANDO COM FUNES

Funes escalares
As funes escalares definidas pelo usurio retornam um nico valor de dados do tipo definido na
clusula RETURNS. Para uma funo escalar embutida, no h nenhum corpo de funo; o valor
escalar o resultado de uma nica instruo. Para uma funo escalar com vrias instrues, o
corpo da funo, definido em um bloco BEGINEND, contm uma srie de instrues do TransactSQL que retornam o valor nico. O tipo de retorno pode ser em qualquer tipo de dados, exceto
texto, ntext, imagem, cursor e carimbo de data/hora.
Funes com valor de tabela
As funes com valor de tabela definidas pelo usurio retornam um tipo de dados de tabela. Para
uma funo com valor de tabela embutida, no h corpo de funo; a tabela o conjunto de
resultados de uma nica instruo SELECT.
Para uma funo com valor de tabela com vrias instrues, o corpo de funo, definido em um
bloco BEGIN... END, contm uma srie de instrues do Transact-SQL que criam e inserem linhas na
tabela que ser retornada.
Funes internas
As funes internas so fornecidas pelo SQL Server para ajudar voc a executar uma variedade de
operaes. Elas no podem ser modificadas. Voc pode usar funes internas em instrues do
Transact-SQL para:

Acessar informaes de tabelas do sistema SQL Server sem acessar os tabelas do sistema
diretamente.
Executar tarefas comuns como SUM, GETDATE ou IDENTITY.

Funes internas retornam os tipos de dados escalar ou de tabela. Por exemplo, @@ERROR retorna
0 se a ltima instruo do Transact-SQL tiver sido executada com xito. Se a instruo gerou um
erro, @@ERROR retorna o nmero do erro. E a funo SUM(parameter) retorna a soma de todos os
valores do parmetro.
Abaixo uma tabela contendo algumas funes internas que podem ser bastante teis
Funo
APP_NAME

Descrio
Retorna o nome do aplicativo para a sesso atual se definido pelo aplicativo

Expresso CASE

Avalia uma lista de condies e retorna uma das vrias expresses de


resultado possveis.

CAST e CONVERT

Converte uma expresso de um tipo de dados para outro.

Desenvolvido por: Alexandre G. Silva


TOTVS ES

Pg. 8 de 18
04/09/2010

Consultas SQL Server


COALESCE

Retorna a primeira expresso no nula entre seus argumentos.

COLLATIONPROPERTY

Retorna a propriedade do agrupamento especificado.

COLUMNS_UPDATED

CURRENT_TIMESTAMP

CURRENT_USER

DATALENGTH

Retorna um padro de bit varbinary que indica as colunas de uma tabela


ou exibio que foram inseridas ou atualizadas.
Retorna o carimbo de data e hora do sistema do banco de dados atual como
um valor datetime sem o deslocamento de fuso horrio do banco de dados.
Retorna o nome do usurio atual.
Retorna o nmero de bytes usado para representar qualquer expresso.
bem similar a funo LEN()

Funes escalares

As funes escalares definidas pelo usurio retornam um valor nico de dados do tipo definido na
clusula RETURNS. Para uma funo escalar embutida, no h um corpo de funo; o valor escalar
o resultado de uma nica instruo. Para uma funo escalar de vrias instrues, o corpo da
funo, definido em um bloco BEGIN...END, contm uma srie de instrues Transact-SQL, que
retornam o valor nico. O tipo de retorno pode ser qualquer tipo de dados, exceto text, ntext,
image, cursore timestamp.
Os exemplos a seguir criam uma funo escalar de vrias instrues. A funo pega um valor de
entrada, um ProductID, e retorna um nico valor de dados, a quantidade agregada do produto
especificado no inventrio.
Exemplo:
USE AdventureWorks2008R2;
GO
IF OBJECT_ID (N'dbo.ufnGetInventoryStock', N'FN') IS NOT NULL
DROP FUNCTION ufnGetInventoryStock;
GO
CREATE FUNCTION dbo.ufnGetInventoryStock(@ProductID int)
RETURNS int
AS
-- Returns the stock level for the product.
BEGIN
DECLARE @ret int;
SELECT @ret = SUM(p.Quantity)
FROM Production.ProductInventory p
WHERE p.ProductID = @ProductID
AND p.LocationID = '6';
IF (@ret IS NULL)
Desenvolvido por: Alexandre G. Silva
TOTVS ES

Pg. 9 de 18
04/09/2010

Consultas SQL Server


SET @ret = 0;
RETURN @ret;
END;
GO

O exemplo a seguir usa a funo ufnGetInventoryStock, para retornar a quantidade atual do


inventrio dos produtos que tm um ProductModelIDentre 75 e 80.
Exemplo:
USE AdventureWorks2008R2;
GO
SELECT ProductModelID, Name, dbo.ufnGetInventoryStock(ProductID)AS CurrentSupply
FROM Production.Product
WHERE ProductModelID BETWEEN 75 and 80;
GO
Funes com valor de tabela

As funes com valor de tabela definidas pelo usurio retornam um tipo de dados table. Para uma
funo com valor de tabela embutida, no h um corpo de funo; a tabela o conjunto de
resultados de uma nica instruo SELECT.
O exemplo a seguir cria uma funo com valor de tabela embutida. A funo pega um parmetro de
entrada, um ID cliente (loja), e retorna as colunas ProductID, Name e a agregao das vendas do
ano, at a data atual, como YTD Total para cada produto vendido para a loja.
Exemplo:
USE AdventureWorks2008R2;
GO
IF OBJECT_ID (N'Sales.ufn_SalesByStore', N'IF') IS NOT NULL
DROP FUNCTION Sales.ufn_SalesByStore;
GO
CREATE FUNCTION Sales.ufn_SalesByStore (@storeid int)
RETURNS TABLE
AS
RETURN
(
SELECT P.ProductID, P.Name, SUM(SD.LineTotal) AS 'Total'
FROM Production.Product AS P
JOIN Sales.SalesOrderDetail AS SD ON SD.ProductID = P.ProductID
JOIN Sales.SalesOrderHeader AS SH ON SH.SalesOrderID = SD.SalesOrderID
JOIN Sales.Customer AS C ON SH.CustomerID = C.CustomerID
WHERE C.StoreID = @storeid
GROUP BY P.ProductID, P.Name
);
GO

O exemplo a seguir invoca a funo e especifica a ID do cliente 602.


Desenvolvido por: Alexandre G. Silva
TOTVS ES

Pg. 10 de 18
04/09/2010

Consultas SQL Server


Exemplo:
SELECT * FROM Sales.ufn_SalesByStore (602);

Para uma funo com valor de tabela de vrias instrues, o corpo da funo definido em um bloco
BEGIN...END contm uma srie de instrues Transact-SQL, que criam e inserem linhas na tabela
que ser retornada.
O exemplo a seguir cria uma funo com valor de tabela. A funo toma um nico parmetro de
entrada, um EmployeeID e retorna uma lista de todos os funcionrios que reportam direta ou
indiretamente ao funcionrio especificado. A funo que especifica a ID do funcionrio 109
invocada em seguida.
Exemplo:
USE AdventureWorks2008R2;
GO
IF OBJECT_ID (N'dbo.ufn_FindReports', N'TF') IS NOT NULL
DROP FUNCTION dbo.ufn_FindReports;
GO
CREATE FUNCTION dbo.ufn_FindReports (@InEmpID INTEGER)
RETURNS @retFindReports TABLE
(
EmployeeID int primary key NOT NULL,
FirstName nvarchar(255) NOT NULL,
LastName nvarchar(255) NOT NULL,
JobTitle nvarchar(50) NOT NULL,
RecursionLevel int NOT NULL
)
--Returns a result set that lists all the employees who report to the
--specific employee directly or indirectly.*/
AS
BEGIN
WITH EMP_cte(EmployeeID, OrganizationNode, FirstName, LastName, JobTitle, RecursionLevel) -CTE name and columns
AS (
SELECT e.BusinessEntityID, e.OrganizationNode, p.FirstName, p.LastName, e.JobTitle, 0 -- Get
the initial list of Employees for Manager n
FROM HumanResources.Employee e
INNER JOIN Person.Person p
ON p.BusinessEntityID = e.BusinessEntityID
WHERE e.BusinessEntityID = @InEmpID
UNION ALL
SELECT e.BusinessEntityID, e.OrganizationNode, p.FirstName, p.LastName, e.JobTitle,
RecursionLevel + 1 -- Join recursive member to anchor
FROM HumanResources.Employee e
INNER JOIN EMP_cte
ON e.OrganizationNode.GetAncestor(1) = EMP_cte.OrganizationNode
INNER JOIN Person.Person p
ON p.BusinessEntityID = e.BusinessEntityID
)
-- copy the required columns to the result of the function
INSERT @retFindReports
Desenvolvido por: Alexandre G. Silva
TOTVS ES

Pg. 11 de 18
04/09/2010

Consultas SQL Server


SELECT EmployeeID, FirstName, LastName, JobTitle, RecursionLevel
FROM EMP_cte
RETURN
END;
GO
-- Example invocation
SELECT EmployeeID, FirstName, LastName, JobTitle, RecursionLevel
FROM dbo.ufn_FindReports(1);
GO
Fonte: http://msdn.microsoft.com/en-us/library/ms177499.aspx

Desenvolvido por: Alexandre G. Silva


TOTVS ES

Pg. 12 de 18
04/09/2010

Consultas SQL Server


5 TRABALHANDO COM PROCEDIMENTOS
Voc pode criar procedimentos armazenados usando a instruo CREATE PROCEDURE Transact-SQL.
Antes de criar um procedimento armazenado, considere que:

As instrues CREATE PROCEDURE no podem ser combinadas com outras instrues SQL
em um nico lote.

Para criar procedimentos, voc deve ter a permisso CREATE PROCEDURE no banco de dados
e a permisso ALTER no esquema no qual o procedimento est sendo criado. Para
procedimentos armazenados CLR, voc deve possuir assembly referenciado em
<mtodo_especificador> ou ter a permisso REFERENCES nesse assembly.

Os procedimentos armazenados so objetos no escopo do esquema e seus nomes devem


seguir as regras para identificadores.

Voc s pode criar um procedimento armazenado no banco de dados atual.

Ao criar um procedimento armazenado, voc deve especificar:

Qualquer parmetro de entrada e sada para o procedimento de chamada ou lote.

As instrues de programao que executam operaes no banco de dados, inclusive de


chamada de outros procedimentos.

O valor de status retornado ao procedimento ou lote de chamada para indicar sucesso ou


falha (e o motivo da falha).

Qualquer instruo de tratamento de erros necessria para detectar e tratar erros potenciais.
As funes de tratamento de erros como ERROR_LINE e ERROR_PROCEDURE podem ser
especificadas no procedimento armazenado. Para obter mais informaes, consulte Usando
TRY...CATCH em Transact-SQL.

Nomeando procedimentos armazenados


Recomendamos que voc no crie qualquer procedimento armazenado usando sp_ como um
prefixo. SQL Server usa o prefixo sp_ para designar procedimentos armazenados do sistema. O
nome escolhido pode estar em conflito com algum procedimento de sistema futuro. Se seu aplicativo
usar referncias de nome qualificado fora do esquema e seu nome de procedimento conflitar com
um nome de procedimento do sistema, seu aplicativo falhar, pois o nome ser associado ao
procedimento do sistema, no ao seu.
Um procedimento armazenado definido pelo usurio que possui o mesmo nome como um
procedimento armazenado do sistema que seja no qualificado ou estiver no esquema dbo nunca
ser executado; em vez disso ser executado sempre o procedimento armazenado do sistema. O
exemplo a seguir demonstra esse comportamento.

Exemplo:
USE AdventureWorks;

Desenvolvido por: Alexandre G. Silva


TOTVS ES

Pg. 13 de 18
04/09/2010

Consultas SQL Server


GO
CREATE PROCEDURE dbo.sp_who
AS
SELECT FirstName, LastName FROM Person.Contact;
GO
EXEC sp_who;
EXEC dbo.sp_who;
GO
DROP PROCEDURE dbo.sp_who;
GO
Usar um qualificador de esquema explcito tambm proporciona uma pequena vantagem de
desempenho. A resoluo de nome ser ligeiramente mais rpida se o Mecanismo de Banco de
Dados no tiver que pesquisar vrios esquemas para localizar o procedimento. Para obter mais
informaes, consulte Executando um procedimento armazenado.
Procedimentos armazenados temporrios
Os procedimentos armazenados temporrios privativos e globais, de maneira anloga s tabelas
temporrias, podem ser criados com os prefixos # e ## adicionados ao nome do procedimento. #
denota um procedimento armazenado temporrio local; ## denota um procedimento armazenado
temporrio global. Esses procedimentos no existem aps SQL Server ser desligado.
Os procedimentos armazenados temporrios so teis na conexo com verses anteriores de SQL
Server que no oferecem suporte ao reuso de plano de execuo para instrues ou lotes TransactSQL. Os aplicativos que se conectam ao SQL Server 2000 e verses posteriores devem usar o
procedimento armazenado do sistema sp_executesql em vez de procedimentos armazenados
temporrios. Apenas a conexo que criou um procedimento temporrio local poder execut-lo e o
procedimento ser automaticamente excludo quando a conexo for fechada.
Qualquer conexo pode executar um procedimento armazenado temporrio global. Um
procedimento armazenado temporrio global existe at que a conexo usada pelo usurio que criou
o procedimento seja fechada e qualquer verso do procedimento sendo executada por qualquer
outra conexo seja concluda. Depois que a conexo usada para criar o procedimento for fechada,
nenhuma execuo adicional do procedimento armazenado temporrio global ser permitida.
Apenas a concluso das conexes que j comearam a executar o procedimento armazenado ser
permitida.
Se um procedimento armazenado no precedido por # ou ## for criado diretamente no banco de
dados tempdb, o procedimento armazenado ser excludo automaticamente quando SQL Server for
desligado, pois tempdb ser recriado cada vez em que SQL Server for iniciado. Os procedimentos
criados diretamente em tempdb existiro mesmo depois que a criao da conexo estiver
terminada.
Observao:
O uso intenso de procedimentos armazenados temporrios pode criar conteno nas tabelas do
sistema em tempdb e afetar o desempenho adversamente. recomendado usar
sp_executesql. sp_executesql no armazena dados nas tabelas do sistema, evitando o
problema.
Os procedimentos armazenados CLR no podem ser criados como procedimentos armazenados
temporrios.

Desenvolvido por: Alexandre G. Silva


TOTVS ES

Pg. 14 de 18
04/09/2010

Consultas SQL Server


Exemplos
A. Usando um procedimento simples com um SELECT complexo
O procedimento armazenado a seguir retorna todos os funcionrios (com os nomes e sobrenomes
fornecidos), cargos e nomes de departamento em uma exibio. Esse procedimento armazenado
no usa nenhum parmetro.
Exemplo:
USE AdventureWorks;
GO
IF OBJECT_ID ( 'HumanResources.uspGetAllEmployees', 'P' ) IS NOT NULL
DROP PROCEDURE HumanResources.uspGetAllEmployees;
GO
CREATE PROCEDURE HumanResources.uspGetAllEmployees
AS
SET NOCOUNT ON;
SELECT LastName, FirstName, JobTitle, Department
FROM HumanResources.vEmployeeDepartment;
GO
O procedimento armazenado uspGetEmployees pode ser executado das seguintes maneiras:
Exemplo:
EXECUTE HumanResources.uspGetAllEmployees;
GO
-- Or
EXEC HumanResources.uspGetAllEmployees;
GO
-- Or, if this procedure is the first statement within a batch:
HumanResources.uspGetAllEmployees;
B. Usando um procedimento simples com parmetros
O procedimento armazenado a seguir retorna somente o funcionrio especificado (com nome e
sobrenome fornecidos), cargo e nome de departamento em uma exibio. Esse procedimento
armazenado aceita correspondncias exatas para os parmetros passados.
Exemplo:
USE AdventureWorks;
GO
IF OBJECT_ID ( 'HumanResources.uspGetEmployees', 'P' ) IS NOT NULL
DROP PROCEDURE HumanResources.uspGetEmployees;
GO
CREATE PROCEDURE HumanResources.uspGetEmployees
@LastName nvarchar(50),
@FirstName nvarchar(50)
AS
SET NOCOUNT ON;
SELECT FirstName, LastName, JobTitle, Department
FROM HumanResources.vEmployeeDepartment
WHERE FirstName = @FirstName AND LastName = @LastName;
GO
Desenvolvido por: Alexandre G. Silva
TOTVS ES

Pg. 15 de 18
04/09/2010

Consultas SQL Server


O procedimento armazenado uspGetEmployees pode ser executado das seguintes maneiras:
Exemplo:
EXECUTE HumanResources.uspGetEmployees N'Ackerman', N'Pilar';
-- Or
EXEC HumanResources.uspGetEmployees @LastName = N'Ackerman', @FirstName = N'Pilar';
GO
-- Or
EXECUTE HumanResources.uspGetEmployees @FirstName = N'Pilar', @LastName = N'Ackerman';
GO
-- Or, if this procedure is the first statement within a batch:
HumanResources.uspGetEmployees N'Ackerman', N'Pilar';
C. Usando um procedimento simples com parmetros de curinga
O procedimento armazenado a seguir retorna somente os funcionrios especificados (com os nomes
e sobrenomes fornecidos), cargos e departamentos em uma exibio. O padro desse procedimento
armazenado corresponde aos parmetros passados ou, quando no fornecidos, usa o padro
predefinido (sobrenomes que comeam com a letra D).
Exemplo:
USE AdventureWorks;
GO
IF OBJECT_ID ( 'HumanResources.uspGetEmployees2', 'P' ) IS NOT NULL
DROP PROCEDURE HumanResources.uspGetEmployees2;
GO
CREATE PROCEDURE HumanResources.uspGetEmployees2
@LastName nvarchar(50) = N'D%',
@FirstName nvarchar(50) = N'%'
AS
SET NOCOUNT ON;
SELECT FirstName, LastName, JobTitle, Department
FROM HumanResources.vEmployeeDepartment
WHERE FirstName LIKE @FirstName AND LastName LIKE @LastName;
GO
O procedimento armazenado uspGetEmployees2 pode ser executado em muitas combinaes.
Apenas algumas combinaes so mostradas aqui:
Exemplo:
EXECUTE
-- Or
EXECUTE
-- Or
EXECUTE
-- Or
EXECUTE
-- Or
EXECUTE
-- Or
EXECUTE

HumanResources.uspGetEmployees2;
HumanResources.uspGetEmployees2 N'Wi%';
HumanResources.uspGetEmployees2 @FirstName = N'%';
HumanResources.uspGetEmployees2 N'[CK]ars[OE]n';
HumanResources.uspGetEmployees2 N'Hesse', N'Stefen';
HumanResources.uspGetEmployees2 N'H%', N'S%';

Desenvolvido por: Alexandre G. Silva


TOTVS ES

Pg. 16 de 18
04/09/2010

Consultas SQL Server


D. Usando parmetros OUTPUT
O exemplo a seguir cria o procedimento armazenado uspGetList, que retorna uma lista dos produtos
com preos que no excedem um valor especificado. O exemplo mostra o uso de vrias instrues
SELECT e vrios parmetros OUTPUT. Os parmetros OUTPUT permitem que um procedimento
externo, um lote ou mais de uma instruo Transact-SQL acessem um valor definido durante a
execuo do procedimento.
Exemplo:
USE AdventureWorks;
GO
IF OBJECT_ID ( 'Production.uspGetList', 'P' ) IS NOT NULL
DROP PROCEDURE Production.uspGetList;
GO
CREATE PROCEDURE Production.uspGetList @Product varchar(40)
, @MaxPrice money
, @ComparePrice money OUTPUT
, @ListPrice money OUT
AS
SET NOCOUNT ON;
SELECT p.[Name] AS Product, p.ListPrice AS 'List Price'
FROM Production.Product AS p
JOIN Production.ProductSubcategory AS s
ON p.ProductSubcategoryID = s.ProductSubcategoryID
WHERE s.[Name] LIKE @Product AND p.ListPrice < @MaxPrice;
-- Populate the output variable @ListPprice.
SET @ListPrice = (SELECT MAX(p.ListPrice)
FROM Production.Product AS p
JOIN Production.ProductSubcategory AS s
ON p.ProductSubcategoryID = s.ProductSubcategoryID
WHERE s.[Name] LIKE @Product AND p.ListPrice < @MaxPrice);
-- Populate the output variable @compareprice.
SET @ComparePrice = @MaxPrice;
GO
Execute uspGetList para retornar uma lista de produtos (bicicletas) da Adventure Works que custam
menos que $ 700. Os parmetros OUTPUT @Cost e @ComparePrices so usados com linguagem
de controle de fluxo para retornar uma mensagem na janela Mensagens.
Observao:
A varivel OUTPUT deve ser definida durante a criao do procedimento como tambm durante o
uso da varivel. O nome do parmetro e da varivel no precisam ser correspondentes;
entretanto, o tipo de dados e o posicionamento do parmetro devem corresponder (a menos que
@ListPrice = variable seja usado).

Exemplo:
DECLARE @ComparePrice money, @Cost money
EXECUTE Production.uspGetList '%Bikes%', 700,
@ComparePrice OUT,
Desenvolvido por: Alexandre G. Silva
TOTVS ES

Pg. 17 de 18
04/09/2010

Consultas SQL Server


@Cost OUTPUT
IF @Cost <= @ComparePrice
BEGIN
PRINT 'These products can be purchased for less than
$'+RTRIM(CAST(@ComparePrice AS varchar(20)))+'.'
END
ELSE
PRINT 'The prices for all products in this category exceed
$'+ RTRIM(CAST(@ComparePrice AS varchar(20)))+'.'
Eis o conjunto parcial dos resultados:
Exemplo:
Product
List Price
-------------------------------------------------- -----------------Road-750 Black, 58
539.99
Mountain-500 Silver, 40
564.99
Mountain-500 Silver, 42
564.99
...
Road-750 Black, 48
539.99
Road-750 Black, 52
539.99
(14 row(s) affected)
These items can be purchased for less than $700.00.
Fonte: http://technet.microsoft.com/en-us/library/ms190669(SQL.100).aspx

Desenvolvido por: Alexandre G. Silva


TOTVS ES

Pg. 18 de 18
04/09/2010

Você também pode gostar